백준 알고리즘

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

여의도비 2018. 9. 2. 22:25

이번 문제는 지난번에 내가 처음 알고리즘이라고 느낄 수 있었던 문제이며 처음 풀었을때 조금은 자괴감을 느끼면서 풀었던 문제이다.

문제 나가신다.


설탕 배달

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 60261 15385 12511 27.779%

문제

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

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.



처음에 이 문제를 풀 때, 그냥 단순 계산으로 느꼈다. 하지만 그게 아니였다. 문제를 보면서 최소한의 개수라는게 너무 머리가 아팠다. 하지만 계속 해서 계산하다가 보니 일단 큰 수로 먼저 나누어 보고! 그 다음에 작은 수인 3kg을 넣을 수있다면 그게 바로 제일 적은 숫자의 봉지로 배달할 수 있다.


일단 우리가 배달 할 수 있는 경우는


1.  5kg으로 다  배달 할 수 있는 경우 (5 * x 개 )

2.  5kg으로 배달 하고 나머지 설탕을 3kg으로 배달 할 수 있는 경우( 5 * x 개 + 3 *  y개)

3.  3kg으로만 배달 하는 경우 ( 3 * x개)


그런데!! 3 kg만으로 배달되는 경우에

1. 3과 5의 최소 공배수인 경우

2. 5kg으로 나눈후 나머지가 3인 경우

더 최소의 숫자로 배달 가능하기에 아래의 소스 코드대로 움직이게 된다.



#include <iostream>
using namespace std;
int main(){
    int min = 0, N;
    cin >> N;
   
    if(N%5 == 0) min = N/5; 

    // 3의 배수인경우에도 가능하기 때문에 먼저 나눠서 가능하면 최소 봉지수를 N / 5로 선언
   
    else{
        if(N%3 == 0) min = N/3;

// 이제 5의 배수로도 나눠지지 않지만 3의 배수로 나눠지는 경우 최소 봉지수 N / 3으로 선언
       
        for(int i=1 ;i<=N/5 ;i++){
            if( ( N - i * 5 ) % 3 == 0) min = ( N - i * 5 ) / 3 + i; // 만약  N에서 5kg 씩 빼면서 3으로 나눴을 때 나머지가 0이면 이게 최소 봉지수가 되므로 다시 최소 봉지수를 선언
        }
        if(min == 0) min = -1;   // 이도 저도 아니면 -1 선언
        }
        cout << min;
        return 0;
}