정화 코딩

백준 새싹 배지 얻기 - 1월 둘째 주 본문

PS

백준 새싹 배지 얻기 - 1월 둘째 주

jungh150c 2023. 1. 9. 22:11

1/9. 조약돌 (백준 2097번)

 

https://www.acmicpc.net/problem/2097

 

//C
#include <stdio.h>
#include <math.h>

int main()
{
    int n, m, ans;
    scanf("%d", &n);

    if(n <= 2)
    {
        printf("4\n");
        
        return 0;
    }

    m = (int) ceil(sqrt(n));
    
    if(n <= (m-1)*m)
        ans = 4*m - 6;
    else
        ans = 4*m - 4;
    
    printf("%d\n", ans);

    return 0;
}

 

이 문제는 코드 짜는게 어렵다기 보다는 식을 세우는 게 좀 복잡했다. 규칙을 찾아야 했다. 일단 1부터 20정도까지 결과가 어떻게 되는지 그림을 그려가며 파악했고, 이 과정을 통해 규칙을 찾을 수 있었다. 우선 n을 입력 받고 루트를 씌운 후 올림을 해서 m을 얻는다. (올림 ceil, 내림 floor. <math.h> 필요.) n의 크기로 두 부분으로 나누고, 어떤 부분인지에 따라 결과값을 ans에 저장한다. (정답)

 


 

1/9. 펫 (백준 2097번)

 

https://www.acmicpc.net/problem/1362

 

//C
#include <stdio.h>

int main()
{
    int o, w, n;
    int isdead = 0;
    int scene = 1;
    char action[1000];
    int time[1000];

    for(int j = 0; j < 1000; j++)
    {
        scanf("%d %d", &o, &w);

        if((o == 0) && (w == 0))
            return 0;

        for(int i = 0; i < 1000; i++)
        {
            scanf(" %c %d", &action[i], &time[i]);

            if(action[i] == '#')
            {
                n = i;
                break;
            }
        }

        for(int i = 0; i <= n; i++)
        {
            if(action[i] == 'E')
            {
                w -= time[i];
                if(w <= 0)
                    isdead = 1;
            }
            else if(action[i] == 'F')
            {
                w += time[i];
            }
            else if(action[i] == '#')
            {
                if(isdead == 0)
                {
                    if((2*w > o) && (w < 2*o))
                        printf("%d :-)\n", scene);
                    else
                        printf("%d :-(\n", scene);
                }
                else
                    printf("%d RIP\n", scene);
                
                isdead = 0;
                scene += 1;
            }
        }
    }
    
    return 0;
}

 

며칠 전에 풀었다가 너무 어려워서 포기했던 문제. 오빠가 자기가 봐주겠다고 했지만 나는 다시 도전해보기가 싫어서 그냥 됐다고 했다. 근데 오빠가 문제 번호라도 알려달라고 그래서 알려줬더니 문제를 읽고 내 코드를 보러 왔고, 어쩌다보니 다시 풀어 보게 되었다. 나는 처음에 내 코드의 문제가 시나리오 별로 입력 후 출력이 된다는 점인 줄 알았는데, 오빠는 그건 지금은 입력 터미널과 출력 터미널이 같아서 문제가 되는 것처럼 보이는데 실제는 그렇지 않아서 괜찮다고 해줬다. 그리고 버퍼때문에 문제가 발생한 것 같다고 하면서 %c 앞에 공백을 넣어줬다. 그 순간 씨프실 수업에서 배웠던 내용이 생각났다. 문자를 반복적으로 입력받을 때 %c 앞에 띄어쓰기를 하나 넣어주지 않으면 엔터까지 문자로 입력된다는 것이었다. 그렇게 하고 실행하니 정상적으로 실행이 되었고, 맞았다!! (정답) 난 정말 오빠 없었으면 코딩을 어떻게 했을까 싶다. 오빠 고마워... 하트

이 문제를 풀면서 오빠가 이런 말을 했다. C언어로 문제를 풀면 이렇게 로직은 맞는데 입출력 때문에 뭣같은 경우가 많다고. 이 문제 같은 경우도 내 코드의 로직은 문제가 없었는데 버퍼때문에 문제가 발생한거라고. 맞는 말인 것 같다. 나 또한 C언어로 문제를 풀면서 입출력 때문에 생긴 골치아픈 일들이 많았기 때문이다. 그래서 문제 풀 때는 C언어 말고 C++이나 파이썬 같은 좀 더 고급 언어로 하면 좋다고 그랬다. C보다 고급 언어인 C++와 파이썬은 기능이 많고 신경써야 하는 것들이 줄어드는 것 같다. 그만큼 학습 효과 측면에서는 부족한 것처럼 느껴지기도 하지만... 파이썬을 다시 배워보는 걸 고려해봐야겠다. 

 


 

1/10. 분산처리 (백준 1009번)

 

https://www.acmicpc.net/problem/1009

 

//C
#include <stdio.h>
#include <math.h>

int main()
{
    int t;
    scanf("%d", &t);

    int a[t], b[t], c[t];
    for(int i = 0; i < t; i++)
        scanf("%d %d", &a[i], &b[i]);

    for(int i = 0; i < t; i++)
    {
        a[i] %= 10;

        b[i] %= 4;

        if(b[i] == 0)
            b[i] = 4;

        c[i] = (int) pow(a[i], b[i]);
        c[i] %= 10;

        if(c[i] == 0)
            c[i] = 10;

        printf("%d\n", c[i]);
    }

    return 0;
}

 

이 문제는 같은 수를 계속 곱해나갈 때, 그 수의 일의 자리수는 특정 주기마다 반복된다는 것을 사용하는 문제이다. 예를 들어 1은 1이 계속 반복되고, 2는 2, 4, 6, 8이 반복되고, 3은 3, 9, 7, 1이 반복되고... 이런 식으로 말이다. 처음에는 a의 일의 자리수를 기준으로 나눠서 주기를 다르게 하려고 했으나, 그냥 a가 어떤 수든 4의 주기로 반복된다고 하는 것이 더 간단할 것 같다고 느꼈다. (주기가 전부 1 아니면 2 아니면 4인데, 4라는 수가 그렇게 크지 않기 때문이다.) 처음에는 b와 c가 딱 나누어 떨어져서 0이 되는 상황을 생각하지 못해 틀렸다. (오답) c가 0일 때 10으로 바꿔주는 코드만 추가하고 또 틀렸다. (오답) 여기서부터는 뭐가 잘못된건지 정말 모르겠어서 질문 게시판을 둘러보기 시작했고, b가 0일 때 4로 바꿔주어야 한다는 것을 알게 됐다. (b가 0이면 c가 무조건 1이 되니까.) 질문 게시판에 상주하고 계시는 코딩 천재님들 덕분에 오늘의 문제 완료! (정답)

 


 

1/11. 파티가 끝나고 난 뒤 (백준 2845번)

 

https://www.acmicpc.net/problem/2845

 

//C
#include <stdio.h>

int main()
{
    int l, p;
    scanf("%d %d", &l, &p);

    int real = l * p;

    int news[5];

    for(int i = 0; i < 5; i++)
    {
        scanf("%d", &news[i]);
        printf("%d ", news[i] - real);
    }

    return 0;
}

 

오늘은 브론즈4 문제로 가볍게 슝- (정답)

 


 

1/12. 국회의원 선거 (백준 1417번)

 

https://www.acmicpc.net/problem/1417

 

//C
#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);

    int per[n];
    for(int i = 0; i < n; i++)
        scanf("%d", &per[i]);
    
    int count = 0;

    while(1)
    {
        int maxindex = 1;

        for(int i = 1; i < n; i++)
            if(per[i] > per[maxindex])
                maxindex = i;
        
        if(per[0] > per[maxindex])
            break;
        
        if(per[0] <= per[maxindex])
        {
            per[0]++;
            per[maxindex]--;
            count++;
        }
    }

    printf("%d\n", count);

    return 0;
}

 

계속 브론즈 문제만 풀다가 오늘은 실버를 도전해보고 싶어서 실버에서 고른 문제! (지금까지 실버 문제를 5개밖에 안 풀었다니..!!) 실버5였지만 그렇게 어려운 문제는 아니었다. (정답)

 


 

1/13. 오븐 시계 (백준 2525번)

 

https://www.acmicpc.net/problem/2525

 

//C
#include <stdio.h>

int main()
{
    int a, b, c;

    scanf("%d %d", &a, &b);
    scanf("%d", &c);

    a += (c / 60);
    b += (c % 60);

    if(b >= 60)
    {
        b -= 60;
        a++;
    }

    if(a >= 24)
        a -= 24;
    
    printf("%d %d\n", a, b);

    return 0;
}

 

오늘도 브론즈3으로 가벼운 문제 슈슝- (정답)

 


 

1/14. 별 찍기 - 1 (백준 2438번)

 

https://www.acmicpc.net/problem/2438

 

#python

n = int(input())

for i in range(n):
    print ('*' * (i+1))

 

파이썬으로 푸는 첫 문제!! (정답)

 


 

1/15. N 찍기 (백준 2741번)

 

https://www.acmicpc.net/problem/2741

 

#python

n = int(input())
for i in range(n):
    print(i+1)

 

오늘도 파이썬으로 가볍게 한 문제~ (정답)

 

Comments