2 minute read



입출력 예시

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의배수라는 기준을 두고 얼마냐 차이가 나는지를 통해 반복문 없이 조건문만으로 봉지의 개수를 구할 수 있었다.