Java/BackJoon

[Bac|<joon>] 백준 : 2839 : 설탕배달

모모토 2021. 4. 27. 12:06

 

이 문제를 맞닥뜨리면 가장 먼저 하는 착각이 있다. 본인은 봉지의 최소 개수만을 생각한 탓에 놓친 것이 있는데 이 문제는 수학 문제이기도 하지만 가장 중요한 목적은 가능하다면 5kg와 3kg를 이용해서 배달을 하는 게 목적이다.

예를 들어서 19kg이라면 5kg 두 개 3kg세개를 해서라도 배달을 해야 하는데 우리의 목표인 것

 

1) 설탕의 무게 N (Scanner로 입력받는다.)

 

2) for문의 구조

 

유의해야 할 점은 정확하게 N킬로그램을 만들 수 있다면, 5kg을 최대한 많이 만들어야 한다. 3kg는 최소로 만들어야 한다.

따라서 바깥 for문의 변수를 i로, 안쪽 for문을 j로 설정하여 조건식 "설탕의 무게=(5*j + 3*i)"를 만족하는 제일 처음의 (i, j) 조합을 구하여 서로 더하면 그게 바로 문제에서 설정한 조건들을 충족시키면서 동시에 봉지의 최소 개수(i+j)이다.

 

+ Break문 -> 안쪽 for문에서 연산이 끝나고 break로 나가도 바깥 for문의 연산은 실행되기 때문에 바깥 for문에 이름을 주어서 break loop;로 한 번에 바깥 for문까지 빠져나가므로 만약 i의 범위가 엄청 커질 시엔 필요 없는 연산을 줄여 연산 시간을 단축할 수 있다. 

 


Answer

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int sugar=0;
		int totalNum=0;
		loop: for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 2000; j++) {
				sugar = 5 * j + 3 * i;
				if (sugar == N) {
					sugar = N;
					totalNum = i + j;
					break loop;
				}
			}
		}
		if(totalNum > 0) System.out.println(totalNum);
		else System.out.println("-1");
	}
}