본문 바로가기

건승하고있어요/알고리즘

[sort] 설탕배달하기

반응형

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


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


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

(출처: https://www.acmicpc.net/problem/2839)



나같은 미천한 생각과 지식을 가진 빈곤한 뇌의 소유자는 어떻게 해야할지 많은 고민을 했다고 합니다.

아주 많이 고민하고 삽질하고 똥푸고 뭐 그러다 보니.... 과거 수능수학 좌표를 일일이 하나씩 구하던 경우의 수가  생각나기도 하고...

어쨌거나 친구의 힌트는 제게 한줄기 빛과 같았고.. 풀게 되었으니 어찌 아니 기쁠까여..


포인트는 5kg 봉지 몇개를 가져오는게 가장 가벼울 것인가를 알아내는 게 뽀인뜨였다.

하지만 나는 되도 않는 머리로 최소공배수 최대공약수 세어가며 되도 않는 숫자를 만들어 내느라 힘들었다.


변수들 이름이 다 저렇게 성의없는 이유는 제가 그렇습니다... 계획도 구상도 성의도 없어서-ㅠ-; 우선 그냥 해본다고 시작한게 저렇게 되어버렸습니다. 앞으로 생각하면서 코딩하겠습니다. 하으하으앙 ㅠ_ㅠ 


        int z = 0;
        int Y = N / 5;
        for (int i = 0; i <= Y ; i++) {
            if (N - 5 * i >= 0 && (N - 5 * i) % 3 == 0) {
                z = i;
            }
        }


이게 바로 그 코드이다. 우선 사용자에게 몇키로를 배달할지 숫자를 받은 뒤 그 숫자를 5로 나눈다. 무게가 무거운게 많을 수록 봉지 수는 줄어들테니, 우선은 5로 나누고 그 남은 수를 3으로 나누었을 때 나머지가 없는지를 확인하는 포문이당.

그래서 5로 몇번을 나눴을 때 나머지를 남기지 않고 적은 수로 봉지를 구성할 수 있을지 5봉지의 숫자를 정해주는 포문.


int B = N -(5 * z);
        int C = B / 3;
        int D = B % 3;
        if (D == 0) {
            System.out.println("5kg : " + z + "  3kg : " + C + " 총 " + (z+C));
 
        } else if (D != 0) {
            System.out.println("-1");
        }
 


위에서 구한 5kg의 수를 구해서 그 수를 빼주고 그 나머지 수를 3으로 나눠준다. 그리고 그 나머지가 있으면 -1을 출력,

나머지가 없는 경우는 그 봉지 수 출력


힘들었다. 

언제 나는 이런 문제를 보고 바로바로 실마리를 풀어내는 능력이 생기려나!!!


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
import java.util.Scanner;
 
public class sugar {
 
    public static void main(String[] args) {
 
        Scanner scan = new Scanner(System.in);
        int N;
        boolean A = true;
 
        N = scan.nextInt();
        while (A) {
            if (N < 3 || N > 5000) {
                System.out.println("다시 입력해주세요.");
                N = scan.nextInt();
            } else {
                A = false;
            }
        }
        //5키로 봉지를 몇개 가져갈 때 가장 적게 가져갈 수 있는지 세어 보는 
        int z = 0;
        int Y = N / 5;
        for (int i = 0; i <= Y ; i++) {
            if (N - 5 * i >= 0 && (N - 5 * i) % 3 == 0) {
                z = i;
            }
        }
 
        int B = N -(5 * z);
        int C = B / 3;
        int D = B % 3;
        if (D == 0) {
            System.out.println("5kg : " + z + "  3kg : " + C);
 
        } else if (D != 0) {
            System.out.println("-1");
        }
 
    }
 
}
 
cs


반응형