[Baekjoon] 설탕 배달

Jay Mild Lee·2022년 11월 27일
0

Algorithm Problems

목록 보기
15/16

I. 설탕 배달

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

1. 문제 설명

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

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

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

2. 제한 사항

  • 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
  • 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

3. 풀이

문제의 핵심은 설탕을 최대한 많은 5kg짜리 설탕 봉지로 담아내는 것에 있다. 따라서 우선 5kg짜리 설탕 봉지를 최대한 많이 사용하는 경우(N/5)부터 사용하지 않는 경우(0)까지 모든 경우를 돌면서, 5kg으로 담고 난 나머지를 3kg짜리 봉지로 담을 수 있는 지 확인했다.

결론적으로, 다음과 같이 진행했다.

  1. boolean flag = false 를 통해, 주어진 입력(N)이 5kg 봉지와 3kg 봉지로 구성이 가능한 지를 판단해 저장한다.
  2. int threeint five에 각각 3kg 봉지의 수와 5kg 봉지의 수를 저장한다,
  3. for (int i = x/5; i >= 0; i--) 구문을 통해, 5kg을 최대한 많이 사용하는 경우부터, 사용하지 않는 경우까지 확인한다.
  4. (x-i*5)%3 == 0를 만족하는 경우, flagtrue로 변경하고, for문을 종료한다.
  5. flagtrue인 경우, int threeint five의 합을 반환한다.
  6. flagfalse인 경우, -1을 반환한다.

4. 소스 코드

package src.baekjoon.sugar_delivery;

import java.util.Scanner;

public class Main {
    public static int calc(int x) {
        boolean flag = false;

        `int three = 0;`
        int five = 0;

        // 5kg으로 최대한 봉지를 구성
        for (int i = x/5; i >= 0; i--) {
            if ((x-i*5)%3 == 0){
                five = i;
                three = (x-i*5)/3;
                flag = true;
                break;
            }
        }

        if (flag){
            return three+five;
        }
        return -1;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x = scanner.nextInt();
        scanner.nextLine();

        System.out.println(calc(x));
    }
}

5. 참고할만한 풀이

추후 추가 (3kg 봉지를 먼저 구하는 방식)

0개의 댓글