💻 CodeUp C언어 기초 100제

42서울을 준비하며 c언어에 대한 기억이 많이 사라졌기 때문에 한번 기초 100제를 풀어보며 시간도 측정해보고 어렵거나 풀지못하는 문제는 따로 포스팅하여 다시한번 풀어볼 예정이다.

먼저 100제를 풀고 그 이후에 코딩테스트 문제나 어려운 알고리즘문제, 자료구조 문제등 다양한 문제를 풀어보고 내가 모르고 있는걸 정확하게 파악하려고 한다.

[1092] 92번째 문제

1092번 문제

같은 날 동시에 가입한 인원 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번째 문제

1092번 문제

격자판의 세로(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;
}

검색을 통해 조금 더 보완한 코드이다.

훨신 더 간편해진 코드이다. 나는 탐색하면서 맞는 자리에 삽입하는 식으로 진행 했는데 다시 푼 코드에서는 그 좌표에 그냥 삽입하여 아마도 훨씬 메모리를 적게 잡아먹었을 것이다.

생각보다 내 기억이 많이 살아있던거 같다…! 다행이면서도 정말 기초만 풀었는데도 많이 헤맨 거 같다.

내일이나 모래에는 조금 더 어려운 문제들로 다양하게 풀어보겠다.

codeup


https://codeup.kr/problemsetsol.php?psid=23 - codeup기초 100제입니다.

태그: ,

카테고리:

업데이트:

댓글남기기