PS/백준

[백준/2938번/java] - 설탕 배달

정코딩딩 2024. 5. 23. 12:33

 

문제를 읽고 딱 든 생각은 최소의 갯수를 구해야하니까 5로 먼저 나누어야겠다고 생각했습니다. 그래서 처음으로 그려본 전체적인 코드의 모습은 아래 사진과 같았습니다! 공통으로 계산하는 부분도 있어서 이 부분은 메소드로 빼고 사용해야겠다~ 라고 생각하고 구현했는데..

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int count = 0;

        int five = N / 5;

        if(five == 0){
            System.out.println(checkThree(N, count));
        }else{
            count += five;
            int remain = N%5;
            System.out.println(checkThree(remain, count));
        }
    }

    static int checkThree(int num, int count){
        if(num % 3 != 0){
            return -1;
        }else{
            count += num/3;
            return count;
        }
    }
}

실행 결과는 실패..!

이유가 뭘까 생각해보았을 때 6을 입력해도 9를 입력해도 -1 이 출력되기 때문이었습니다

그래서 아 그러면 기존의 방식은 그대로 가져가되, -1이 출력되는 건에 한해서만 3으로만도 나눠보자! 라고 생각했고

 

실제로 그렇게 코드를 구현했을 때에는 11이라는 문제점이 발견되었습니다..

5로 나눠도 -1.. 3으로 나눠도 나누어떨어지지않기 때문에 -1 출력...

 

그래서 다시 접근해보았습니다!!

18은 왜 4번이지에 대해 생각해보면 5+5+5+3이고 왜 11은 3이지? 생각해보면 5+3+3 이기 때문입니다.

11을 5와 3으로 표현할 수 있는 방법에 대해 나열해보자면

11 = 5+5+1 (x)

    = 5+3+3(o)

    = 3+3+3+2(x)

이렇게 5의 갯수를 하나씩 줄여가면서 경우들을 찾을 수 있었습니다!

그래서 나온 코드는 아래와 같습니다.

import java.util.Scanner;

public class boj_2839 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int count = -1;

        for (int five = N / 5; five >= 0; five--) {
            int remain = N - (five * 5);
            if (remain % 3 == 0) {
                count = five + (remain / 3);
                break;
            }
        }

        System.out.println(count);
    }
}

 

먼저 주어진 숫자에서 5가 최대로 들어갈 수 있는 횟수를 알기위해 N/5 를 해줍니다. N/5 는 입력으로 받은 수 안에 5가 들어갈 수 있는 "최대" 횟수이므로 for 문을 돌면서 five 라는 변수를 하나씩 줄여주면서 나누어떨어지는 경우를 탐색합니다!

위에 11에 대해 더하기로 표현해놓은 부분을 코드로 변환한 부분이라고 생각하면 됩니다.

 

5로도, 3으로도 나누어떨어지는 경우에는 break 로 for 문을 빠져나오고 그때의 count 를 출력해주면 문제가 끝납니다!

 

 

끝!