본문 바로가기
Java/문제

백준 2839번: 설탕 배달

by 열지희공 2021. 1. 18.

백준 2839번

풀이

먼저 배달하는 봉지의 수를 최대한 줄여야 하므로

가능한 5kg 봉지를 최대한 많이 가져가야 되겠다는 생각이 먼저 들었다.

 

5kg 봉지의 개수를 a, 3kg 봉지의 개수를 b로 생각했다.

 

N = 5a + 3b라는 조건을 만족시키기 위해 

a를 가능한 큰 수 부터 넣어보기로 했다.

 

a가 될 수 있는 가장 큰 수는 N을 5로 나눈 몫이 될 것이다.

그래서 a에 (N을 5로 나눈 몫)부터 (0)까지 대입해보아서 위의 조건을 만족하는지 살펴보기로 했다.

 

a에 값을 대입한 후 

만약 N에서 (5kg의 봉지 * a(개수)) 만큼의 무게를 뺀 값이 만약 3으로 딱 나누어 떨어진다면

N = 5a + 3b라는 조건을 만족할 것이다.

 

위의 생각을 가지고 코드를 짜기 위해

 

a에 값을 대입할때는 for반복문을

조건을 만족하는지 검사할때는 if조건문을 이용해야겠다는 생각이 들었다.

 

내 코드

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		int a = 0;
		int b = 0;
		int N = 0;
		Scanner scanner = new Scanner(System.in);

		N = scanner.nextInt();
		
		int flag = 0;
		
		for(int i = N/5;i>=0;i--) {
			a = i;
			if((N-5*a)%3==0) {
				b = (N-5*a)/3;
				flag = 1;
				break;
			}
		}
		
		if(flag == 1) {
		System.out.println(a+b);
		}
		else
			System.out.println("-1");
	}

}

 

먼저 N을 입력받은 뒤

위의 생각대로 a에 N을 5로 나눈 몫부터 0까지 넣는 반복문을 작성했다.

 

만약 (N-5a)을 3으로 나눈 나머지가 0이라면 조건을 만족하므로 

b는 (N-5a)/3이 된다. 

 

a에 대입되는 값은 점점 작아지기 때문에

만약 조건을 만족하는 a, b값이 있다면

그 a, b가 조건을 만족하는 a들 중 가장 큰 a가 될 것이고

따라서 배달하는 봉지의 최소 개수의 조건일 것이다.

 

그러므로 조건을 만족하는 a, b값이 나온다면 바로 break를 이용해 반복문을 빠져나오게 했다.

 

또한 문제조건 중 정확하게 N킬로그램을 만들 수 없다면 -1을 출력해야 하므로

flag변수를 만들어 모든 반복을 마친 것인지, break를 이용해 반복을 끝낸것인지 확인했다.


이번 문제는 어려워서 푸는데 꽤 오래걸렸다ㅠ

완성한 코드가 효율적인지 확신이 가지 않아서 구글링해보니 

엄청나게 다양한 풀이들이 있었다!!

담에 자바를 더 공부한 뒤 다른 방법으로도 다시한번 풀어보면 좋을 것 같담..!

 

'Java > 문제' 카테고리의 다른 글

자바스터디 6주차 문제 풀이(클래스, 상속 관련)  (0) 2021.02.19
클래스(class)관련 문제 풀이  (1) 2021.02.01
백준 2739번: 구구단  (1) 2021.01.17
백준 10430번: 나머지  (1) 2021.01.17