본문 바로가기

알고리즘 문제풀이

[알고리즘] 백준 2839번 "설탕 배달" 문제 풀이 (C/C++) - Don 임베디드

상근이는 포장된 설탕을 배달하는 일을 한다.

정확하게 N kg의 설탕을 배달해야 하는데, 설탕은 5kg과 3kg으로 포장되어 있다.

 

규칙 1. 상근이는 최대한 적은 개수의 봉지로 N kg을 만들어 배달한다.

규칙 2. 정확하게 N kg가 되지 않는 경우에는 배달하지 않는다.

 

입력으로 숫자 N 이 주어질 때,

상근이가 가져갈 봉지의 개수를 구하는 프로그램을 작성하시오.

 

제약:

시간 제한 1초, 메모리 제한 128MB

3 <= N <= 5000

 

예제 1 입력. 예제 1 출력.
18 4
예제 2 입력. 예제 2 출력.
4 -1
예제 3 입력. 예제 3 출력.
6 2

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, nAnswer, nMaxFive;
 
    cin >> N;
 
    // 정답이 없는 경우에 출력할 값을 초기 값으로 설정.
    nAnswer = -1;
    // N에 들어갈 수 있는 5의 최대 개수.
    nMaxFive = N / 5;
 
    switch (N % 5)    // 5로 나누었을 때 나머지에 따라 case 별로 계산.
    {
        case 0:
            nAnswer = N / 5;
            break;
 
        case 1:
            if ((nMaxFive - 1>= 0)
            {
                // 5 * (몫 - 1)개 + 3 * (2)개
                nAnswer = (nMaxFive - 1+ 2;
            }
            break;
 
        case 2:
            if ((nMaxFive - 2>= 0)
            {
                // 5 * (몫 - 2)개 + 3 * (4)개
                nAnswer = (nMaxFive - 2+ 4;
            }
            break;
 
        case 3:
            if ((nMaxFive) >= 0)
            {
                // 5 * (몫)개 + 3 * (1)개
                nAnswer = (nMaxFive) + 1;
            }
            break;
 
        case 4:
            if ((nMaxFive - 1>= 0)
            {
                // 5 * (몫 - 1)개 + 3 * (3)개
                nAnswer = (nMaxFive - 1+ 3;
            }
            break;
 
        default:
            break;
    }
 
    // 답 출력.
    cout << nAnswer << endl;
 
    return 0;
}
 
cs

문제 원본 링크:

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