백준 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 |