반응형
2839번: 설탕 배달
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그
www.acmicpc.net
1. 문제 추상화
3kg, 5kg 설탕봉지를 사용하여, 정확히 Nkg 설탕을 옮길 때, 봉지의 수를 최소화해라.
2. 알고리즘
3kg 봉지의 개수 : a
5kg 봉지의 개수 : b
옮겨야 할 설탕무게 : N (kg)
그러므로, 3a + 5b = N 이 성립한다.
a의 개수가 정해지면 b의 개수는 '자동으로' 정해진다. ( 함수 종속 )
N을 11이라 가정하자.
b가 0일때, a는 최대가 된다. 그러므로 0<= a <= 11/3 ( 3. xxx )
a는 정수이므로 0, 1, 2, 3이 범위에 포함된다.
b는 a에 따라 값이 '자동으로' 정해지므로 b의 값을 정리하면 아래와 같다.
함수식 : 3a + 5b = 11 ( N ) ( 단, b는 정수여야 한다. )
a | 0 | 1 | 2 | 3 |
b | 정수 X | 정수 X | 1 | 정수 X |
고로, a + b를 하면 3이다.
옮겨야 할 무게가 11kg일 때, 3kg 두 봉지, 5kg 1 봉지를 옮기면 되므로 총 3 봉지이다.
문제의 목적은 최소 봉지를 구하는 것이므로, a+b가 최소인 값을 반복문으로 구한다.
3. 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int goal = sc.nextInt();
int maxNumFor3kg = goal / 3; // 5kg 봉지의 개수가 0일때, 3kg의 최대 봉지 개수
int numFor5kg = 0;
int min = 5000/3; // 최소 봉지 개수 초기화
for(int i=0; i <= maxNumFor3kg; i++) {
if(( goal - 3*i ) % 5 == 0) { // 5kg 봉지의 개수가 정수인 것만 선별
numFor5kg = ( goal - 3*i ) / 5;
if( ( i + numFor5kg ) < min ) {
min = i + numFor5kg; // 봉지 개수의 최소값 선별
}
}
}
if(min == 5000/3) {
System.out.println(-1);
}else {
System.out.println(min);
}
}
}
반응형
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 1011번 Fly me to the Alpha Centauri : 부등식과 반복문 3 (0) | 2021.07.20 |
---|---|
[JAVA] 백준 10757번 큰 수 A + B : BigInteger, StringBuilder (0) | 2021.07.19 |
[JAVA] 백준 2775번 부녀회장이 될테야 : 이차원 배열 (0) | 2021.07.18 |
[JAVA] 백준 2869번 달팽이는 올라가고 싶다 (0) | 2021.07.16 |
[JAVA] 백준 1193번 분수찾기 : 부등식과 반복문 2 (0) | 2021.07.15 |