본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2839번: 설탕 배달 C언어

문제 출처: www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

1. 코드

#include <stdio.h>

int main(void)
{
    int N = 0, A = 0, B = 0, i = 0;
    
    scanf("%d", &N);
    if(N % 5 == 0)
    {
        printf("%d", N / 5);
        return 0;
    }
    if(N % 3 == 0) A = N / 3;
    
    for(i = N / 5; i > 0; i--)
    {
        if((N - 5 * i) % 3 == 0)
        {
            B = (N - 5 * i) / 3 + i;
            break;
        }
    }
    if(A == 0 && B == 0)
    {
        printf("-1");
        return 0;
    }
    
    if(B == 0) printf("%d", A);
    else printf("%d", B);
    return 0;  
}

 

2. 문제 해결 방식

우선 입력한 N의 수가 5의 배수인지 3의 배수인지 확인한다. 그리고 만약 5의 배수라면 봉지의 최소 개수가 5로 나눈 값이기 때문에 출력하고 프로그램을 종료한다. 만약 그것이 아니라면 3의 배수를 체크한다. 3의 배수 같은 경우에는 최솟값일 수 있고 아닐 수도 있다. 그렇기 때문에 값을 A에 저장하고 넘어간다.

그리고 3의 배수도 아니고 5의 배수가 아닐 수 있다면 혼합된 경우도 있을 것이다. 이것을 반복문을 이용하여 풀도록 한다. 반복문을 이용하여 N / 5의 값을 초기값으로 설정하고 점차적으로 -1씩 더한다. 그렇다면 (N - 5 * i)의 값이 매우 작은 값부터 시작되어 3의 배수를 찾게 한다면 5킬로그램의 봉지 개수를 늘릴 수 있다. 만약 찾았다면 봉지의 개수를 B에 저장한다.

그런데 이 과정을 다 거쳤는데 A와 B에 아무런 변화가 없을 수도 있다. 그럴 경우에는 불가능하다는 소리이다. 그렇다면 문제에 나온 것처럼 -1을 출력하고 프로그램을 종료한다.

하지만 아니라면 B의 값이 0인지 확인하고 만약 B의 값이 0이면 A를 출력하고 아니라면 B의 값을 출력한다. 그 이유는 A보다는 B가 무조건적으로 작을 수밖에 없기 때문이다.

3. 느낀 점

이 문제를 풀면서 하나의 프로그램을 짠다는 느낌보다는 공식을 찾는다는 느낌이었다. 물론 공식이라고 말할 정도로 매우 간결하고 명확하지는 않지만 코딩보다는 수학을 하는 느낌이 강했다. 앞으로 코딩을 하다 보면 이러한 느낌을 자주 느끼거나 이러한 문제를 자주 풀 수도 있는데 아마 지금처럼 힘들 것이다.

그렇기 때문에 계속해서 이러한 비슷한 문제를 자주 풀어보면서 연습해봐야겠다.