본문 바로가기
알고리즘 PS/백준 알고리즘

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

by 백호루이 2022. 9. 14.
반응형

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

<문제 분석>

재귀나 반복문으로 푸는 문제가 아니다. 따라서 수들을 늘어서놓고 법칙을 찾아야 한다.

N 3 4 5 6 7 8 9 10 11 12
봉지수     1         2    
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수     3        
N / 5 2 3
N % 5 3 4 0 1 2 3 4

1. 법칙성을 찾기 위해 N/5와 N%5의 값들을 구해본다.

 

N 3 4 5 6 7 8 9 10 11 12
봉지수     1         2    
N / 5                    
N % 5                    
N 13 14 15 16 17 18 19
봉지수     3        
N / 5              
N % 5              

2. 5kg 봉지로 먼저 나눠야 하는 것이 최상이기에 일단 N/5를 한 봉지의 수를 먼저 구한다.

if (n%5 == 0)
  System.out.println(n/5);

 

N 3 4 5 6 7 8 9 10 11 12
봉지수 1   1     2   2    
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수 3   3     4  
N / 5 2 3
N % 5 3 4 0 1 2 3 4

3. 5의 배수 + 3도 최선의 값이다. (5의 배수로 구한 봉지수 + 3kg 봉지수)

if (n%5 == 3)
  System.out.println(n/5 + 1);

 

N 3 4 5 6 7 8 9 10 11 12
봉지수 1   1 2   2   2 3  
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수 3   3 4   4  
N / 5 2 3
N % 5 3 4 0 1 2 3 4

4. 5의 배수 + 6 (5의 배수로 구한 봉지수 + 3kg x 2봉지)

if (n%5 == 1)
  System.out.println(n/5 + 1);

 

N 3 4 5 6 7 8 9 10 11 12
봉지수 1   1 2   2 3 2 3  
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수 3 4 3 4   4 5
N / 5 2 3
N % 5 3 4 0 1 2 3 4

5. 5의 배수 + 9 (5의 배수로 구한 봉지수 + 3kg x 3봉지)

if (n%5 == 4)
  System.out.println(n/5 + 2);

 

N 3 4 5 6 7 8 9 10 11 12
봉지수 1   1 2   2 3 2 3 4
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수 3 4 3 4 5 4 5
N / 5 2 3
N % 5 3 4 0 1 2 3 4

6. 5의 배수 + 12 (5의 배수로 구한 봉지수 + 3kg x 4봉지)

if (n%5 == 2)
  System.out.println(n/5 + 2);

 

N 3 4 5 6 7 8 9 10 11 12
봉지수 1 -1 1 2 -1 2 3 2 3 4
N / 5     1 2
N % 5 3 4 0 1 2 3 4 0 1 2
N 13 14 15 16 17 18 19
봉지수 3 4 3 4 5 4 5
N / 5 2 3
N % 5 3 4 0 1 2 3 4

7. 4와 7은 3kg, 5kg으로 나눠지지 않기 때문에 봉지수가 -1이다.

if (n == 4 || n == 7)
  System.out.println(-1);

 

 

<코드 구현>

import java.util.*;

/*
[백준] 2839번 - 설탕 배달 (Java)
*/

public class Main {
    static int n;

    void InputData() {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
    }

    void Solve() {
        if (n == 4 || n == 7)
            System.out.println(-1);
        else if (n%5 == 0)
            System.out.println(n/5);
        else if (n%5 == 1 || n%5 == 3)
            System.out.println(n/5 + 1);
        else if (n%5 == 2 || n%5 == 4)
            System.out.println(n/5 + 2);
        else
            System.out.println(-1);
    }

	public static void main(String[] args) {
        Main m = new Main();
        m.InputData();
        m.Solve();
	}
}

 

<제출 결과>

<후기>

간단해 보인 문제였지만 풀어보니 머리로만 풀기는 어려웠던 문제였다. 수를 구하는 문제는 예시를 직접 써보는 것이 얼마나 중요한지 느끼게 되었다. 앞으로도 이런 유형의 문제는 주어진 범위만큼 수를 모두 써본다음 규칙성을 찾는 것이 관건일 것 같다.

반응형

댓글