[Java] 백준(실버-4) 2839번 - 설탕 배달

입출력 예시
Input-1
18
Output-1
4
Input-2
6
Output-2
2
Input-3
11
Output-3
3
문제 풀이
이 문제는 반복문과 조건문을 활용한 두 가지 방식으로 풀어보았다.
이 문제의 핵심은 N이 5의 배수로 이루어질 때 봉지의 수가 최소가 된다는 점이다.
그리고 N이 4일 때와 7일 때는 애초에 봉지의 개수를 구할 수 없기에 -1을 반환해야 함을 유의해야 한다.
반복문 활용 풀이
먼저 반복문을 활용해 풀어보자.
단순하게 N이 5의 배수가 될때까지 3을 빼주는 과정을 반복하면 된다.
N이 5의 배수라면 봉지의 개수는 N/5 개가 된다. 아니라면, N을 3씩 빼준다.
위 과정을 반복하며 N이 0보다 작아진다면 반복문을 탈출한다.
그렇다면 반복문을 활용하여 코드를 작성해보자.
1
2
3
4
5
6
7
8
9
10
while(N>0) {
if(N%5 == 0) {
cnt += N/5;
break;
}
else {
N -= 3;
cnt++;
}
}
while문에서 N이 5의 배수라면 봉지의 개수 cnt에 N/5개를 더해주고, 5의 배수가 아니라면 3씩 빼주면서 봉지의 개수를 1씩 증가시킨다.
N을 3씩 빼주다가 0보다 작아지면 while문을 탈출한다.
조건문 활용 풀이
반복문을 사용하지 않고도 풀 수 없을까 고민하며 손으로 N과 5의 나머지와 몫을 적어가던 중 하나의 패턴을 발견했다.
N | 봉지의 개수 | N/5 | N%5 |
---|---|---|---|
3 | 1 | 0 | 3 |
4 | -1 | 0 | 4 |
5 | 1 | 1 | 0 |
6 | 2 | 1 | 1 |
7 | -1 | 1 | 2 |
8 | 2 | 1 | 3 |
9 | 3 | 1 | 4 |
10 | 2 | 2 | 0 |
11 | 3 | 2 | 1 |
12 | 4 | 2 | 2 |
13 | 3 | 2 | 3 |
14 | 4 | 2 | 4 |
15 | 3 | 3 | 0 |
16 | 4 | 3 | 1 |
17 | 5 | 3 | 2 |
18 | 4 | 3 | 3 |
19 | 5 | 3 | 4 |
20 | 4 | 4 | 0 |
위 표를 보면 N이 5의배수+1이거나 5의배수+3 일때 봉지의 수가 같고, N이 5의배수+2이거나 5의배수+4 일때 봉지의 수가 같음을 알 수 있다.
5의 배수를 기준으로 1~4까지의 차에 따라 봉지의 개수를 구할 수 있다.
- 5의배수일 때, 봉지의 개수 = N/5
- 5의배수+1 또는 5의배수+3일 때, 봉지의 개수 = (N/5)+1
- 5의배수+2 또는 5의배수+4일 때, 봉지의 개수 = (N/5)+2
위에서 구한 조건을 활용해 코드를 작성해보자.
1
2
3
if(N%5 == 0) cnt = N/5;
else if(N%5 == 1 || N%5 == 3) cnt = (N/5)+1;
else if(N%5 == 2 || N%5 == 4) cnt = (N/5)+2;
N이 5의 배수일 때는 5로 나눈 몫이 봉지의 개수가 되고, 5의배수+1 또는 5의배수+3 라면 5로 나눈 몫+1 값이 봉지의 개수가 된다.
마지막으로 5의배수+2 또는 5의배수+4 라면 5로 나눈 몫+2 값이 봉지의 개수가 된다.
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int cnt = 0;
if(N==4 || N==7) cnt = -1;
else {
// cnt = loop(N, cnt);
cnt = condi(N, cnt);
}
bw.write(cnt+"\n");
bw.flush();
bw.close();
br.close();
}
public static int loop(int N, int cnt) {
while(true) {
if(N%5 == 0) {
cnt += N/5;
break;
}
else {
N -= 3;
cnt++;
}
if(N<0) break;
}
return cnt;
}
public static int condi(int N, int cnt) {
if(N%5 == 0) cnt = N/5;
else if(N%5 == 1 || N%5 == 3) cnt = (N/5)+1;
else if(N%5 == 2 || N%5 == 4) cnt = (N/5)+2;
return cnt;
}
}
회고
- 5의배수라는 기준을 두고 얼마냐 차이가 나는지를 통해 반복문 없이 조건문만으로 봉지의 개수를 구할 수 있었다.