상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
문제의 핵심은 설탕을 최대한 많은 5kg짜리 설탕 봉지로 담아내는 것에 있다. 따라서 우선 5kg짜리 설탕 봉지를 최대한 많이 사용하는 경우(N/5)부터 사용하지 않는 경우(0)까지 모든 경우를 돌면서, 5kg으로 담고 난 나머지를 3kg짜리 봉지로 담을 수 있는 지 확인했다.
결론적으로, 다음과 같이 진행했다.
boolean flag = false
를 통해, 주어진 입력(N)이 5kg 봉지와 3kg 봉지로 구성이 가능한 지를 판단해 저장한다.int three
와 int five
에 각각 3kg 봉지의 수와 5kg 봉지의 수를 저장한다,for (int i = x/5; i >= 0; i--)
구문을 통해, 5kg을 최대한 많이 사용하는 경우부터, 사용하지 않는 경우까지 확인한다.(x-i*5)%3 == 0
를 만족하는 경우, flag
를 true
로 변경하고, for문을 종료한다.flag
가 true
인 경우, int three
와 int five
의 합을 반환한다.flag
가 false
인 경우, -1
을 반환한다.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));
}
}
추후 추가 (3kg 봉지를 먼저 구하는 방식)