C공부 [2. C언어 기초 100제]
💻 CodeUp C언어 기초 100제
42서울을 준비하며 c언어에 대한 기억이 많이 사라졌기 때문에 한번 기초 100제를 풀어보며 시간도 측정해보고 어렵거나 풀지못하는 문제는 따로 포스팅하여 다시한번 풀어볼 예정이다.
먼저 100제를 풀고 그 이후에 코딩테스트 문제나 어려운 알고리즘문제, 자료구조 문제등 다양한 문제를 풀어보고 내가 모르고 있는걸 정확하게 파악하려고 한다.
[1092] 92번째 문제
같은 날 동시에 가입한 인원 3명이 규칙적으로 방문하는, 방문 주기가 공백을 두고 입력된다. (단, 입력값은 100이하의 자연수이다.)
- 입력
3 7 9
*출력
63
과거에 수학문제같이 최소공배수를 먼저 떠올렸는데 이 문제에 힌트에서 논리연산자를 이용하면 좀더 간단하게 코딩이 가능하다고 해서 한번 풀어봤다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a, b, c, day =1;
scanf("%d %d %d",&a,&b,&c);
while (day%a!=0 || day%b!=0 || day%c!=0)
{
day++;
}
printf("%d", day);
return 0;
}
확실히 간결하고 가독성이 좋다.
3가지 조건 즉, 3가지 수로 나누었을 때 나머지가 0으로 나누어 떨어지는 수를 구할 때 까지 day을 증가시킨것!
내가 생각한대로 풀어도 풀렸겠지만 그래도 조금 더 정답같다?는 코드를 보니 실력이 늘고 있는거 같다.
[1098] 98번째 문제
격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l), 막대를 놓는 방향(d:가로는 0, 세로는 1)과 막대를 놓는 막대의 가장 왼쪽 또는 위쪽의 위치(x, y)가 주어질 때,격자판을 채운 막대의 모양을 출력하는 프로그램을 만들어보자.
*입력
5 5
3
2 0 1 1
3 1 2 3
4 1 2 5
*출력
1 1 0 0 0
0 0 1 0 1
0 0 1 0 1
0 0 1 0 1
0 0 0 0 1
이 문제도 한번 풀어봤던것 같은 기억이 있지만.. 조금 헷갈려서 다시 한번 풀어봤다.
계속 틀린답으로 나와서 도대체 뭐가 문제인지 몰라서 조금 답답했다.
하지만 언제나 그렇듯..컴퓨터는 절대 틀리지 않는다는 것…ㅋ
int main() {
int a[100][100] = {0};
int n,l,d,x,y,w,h;
scanf("%d %d", &w,&h); //h세로 w가로
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d %d %d", &l, &d, &x, &y);
if (d == 0)
{
for (int k = 0; k < w; k++)
{
for (int g = 0; g < h; g++)
{
if (a[k][g] == a[x - 1][y - 1] && l != 0)
{
a[x-1][y-1] = 1;
y++;
l--;
}
}
}
}
else
{
for (int k = 0; k < w; k++)
{
for (int g = 0; g < h; g++)
{
if (a[k][g] == a[x - 1][y - 1] && l != 0)
{
a[x-1][y-1] = 1;
x++;
l--;
}
}
}
}
}
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
내가 푼 답은 정말 하드코딩.. 알고리즘 자체는 이해했지만 풀이과정이 조금 더러운 모습이다. ㅠㅠ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a[100][100] = {0};
int n,l,d,x,y,w,h;
scanf("%d %d", &w,&h); //h세로 w가로
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d %d %d %d", &l, &d, &x, &y);
if (d == 0)
{
for (int j = 0; j < l; j++)
{
a[x][y + j] = 1;
}
}
else
{
for (int j = 0; j < l; j++)
{
a[x+j][y] = 1;
}
}
}
for (int i = 1; i <= w; i++)
{
for (int j = 1; j <= h; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
검색을 통해 조금 더 보완한 코드이다.
훨신 더 간편해진 코드이다. 나는 탐색하면서 맞는 자리에 삽입하는 식으로 진행 했는데 다시 푼 코드에서는 그 좌표에 그냥 삽입하여 아마도 훨씬 메모리를 적게 잡아먹었을 것이다.
생각보다 내 기억이 많이 살아있던거 같다…! 다행이면서도 정말 기초만 풀었는데도 많이 헤맨 거 같다.
내일이나 모래에는 조금 더 어려운 문제들로 다양하게 풀어보겠다.
https://codeup.kr/problemsetsol.php?psid=23 - codeup기초 100제입니다.
댓글남기기