본문 바로가기

[BAEKJOON] 2839번: 설탕 배달

 

 

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
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt();
        int res = Integer.MAX_VALUE;
        int min = Integer.MAX_VALUE;
        int temp;
        
        if(n%5 == 0) {
            res = n/5;
            
        } else if(n%3 == 0) {
            temp = n;
                
            for(int i = 1; temp > 5; i++) {
                temp -= 5;
                            
                if(temp%3 == 0) {
                    if(min > i + (temp / 3)) {
                        min = i + (temp / 3);
                    }
                }
            }    
            
            if(res > min) {
                res = min;
            } else { 
                res = n/3;
            }
            
        } else {
            temp = n;
            
            for(int i = 1; temp > 5; i++) {
                temp -= 5;
                
                if(temp%3 == 0) {
                    if(min > i + (temp / 3)) {
                        min = i + (temp / 3);
                    }
                    
                } 
            }
            
            if(res > min) {
                res = min;
            } else {
                res = -1;
            }
        }
        
        System.out.println(res);
        
        scanner.close();
        
    }
 
}                
 
cs

 

예전에 Java로 풀었던 문제인데, 지금 보니 코드가 다소 난잡하다고 생각돼 C로 다시 풀었다.

 

 

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
#include <stdio.h>
 
int run();
 
int main()
{
    return run();
}
 
int run()
{
    int n; //3 <= n <= 5000
    int count = 0;
    int answer = 5001;
 
    scanf("%d"&n);
 
    if (n % 5 == 0) { answer = n / 5; }
    else
    {
        while (n >= 3)
        {
            if ((n % 3 == 0&& (answer > (count + n / 3))) { answer = count + n / 3; }
 
            n -= 5++count;
        }
    }
 
    printf("%d\n", (answer == 5001) ? -1 : answer);
 
    return 0;
}
cs

 

주머니의 개수를 최소화하려면 5kg짜리 봉지를 최대한 많이 써야 한다.

따라서 5의 배수라면 5로 나눈 몫을 정답으로 간주하고,

그렇지 않다면 5kg씩 설탕을 봉지에 담으면서(n에서 5를 빼면서) 남은 설탕의 양을 확인한다.

남은 설탕이 3의 배수라면 우선 정답 후보에 올린다. 

이 때 기존의 정답 후보보다 작을 때만 정답 후보에 올린다.

따라서 마지막까지 남아있는 후보가 정답이 된다.

만약 5kg 봉지와 3kg 봉지로 정확하게 n kg을 만들 수 없다면 answer는 초기 값이 유지될 것이다.

따라서 초기값의 유지 여부로 -1인지 아닌지 파악한다.

 

 

 

'Programming > Solutions' 카테고리의 다른 글

[Project Euler] Problem 004  (0) 2019.03.20
[Project Euler] Problem 003  (0) 2019.03.19
[BAEKJOON] 1002번: 터렛  (0) 2019.03.19
[Project Euler] Problem 002  (0) 2019.03.18
[Project Euler] Problem 001  (0) 2019.03.17