알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

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

 

2839번: 설탕 배달

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

www.acmicpc.net


Think🤔
package back23y02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SugarDelivery {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int sugar = Integer.parseInt(bf.readLine());
        int answer = 0;
        int three = 3;
        int five = 5;

        if(sugar % five == 0) { // 5로 딱 나눠질 때 가장 최적
            answer += sugar / five;
        }else if((sugar % five) % three == 0) { // 5로 나누고 3으로 나눠질 때 그다음 최적
            answer += sugar / five;
            answer += (sugar / five) / three;
        }else if((sugar % three) % five == 0){
            answer += sugar / three;
            answer += (sugar / three) / five;
        }else if(sugar % three == 0) { // 3으로 나눠질 때
            answer += sugar / three;
        }else { // 그 외 안나눠 지면 -1 출력
            answer = -1;
        }

        System.out.println(answer);

    }

}

중간 중간 5 , 3 을 나눠 떨어지는 반복문을 계속해서 조건을 추가시키고 없애는 방법으로 했다.

그럴려다 보니 그러면 5가 몇번 들어가는지 3이 몇번 들어가는지를 구해야 하기 때문에 더 복잡해지고 구할 수 있는지도 의문이 들었다.

 

이걸 수학적 방식으로 들어가서 

3이랑 5를 더해서 나타낼 수 있는 숫자가 아닌 1,2,4,7 값이 나오면 -1을 리턴하게 해줬고,

5로 나눌 수 없어지면 -3으로 깎으면서 +1을 해줬다.

이렇게 되면 8일 경우에도 5로 나누고 3을 깎아줘서 0이 돼서 if문을 안타고 answer에 제대로 된 값을 넣어서 리턴을 해 줄 수 있다.

 

큰 값인 5로 나누는게 일단 최적의 방법이 맞고,

그 다음 3을 구하는 방법을 -1으로 없애면서 구하는 방법이였다.


Solution✍
package back23y02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SugarDelivery {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int sugar = Integer.parseInt(bf.readLine());
		int answer = 0;
		
		while(true) {
			if(sugar == 4 || sugar == 7 || sugar == 1 || sugar == 2) {
				answer = -1;
				break;
			}
			if(sugar % 5 == 0) {
				answer += sugar / 5;
				break;
			}else { // 안나눠 떨어지면 -3 해서 횟수 증가 시키고 5로 다시 나눔 근데 그게 4나 7이면 
				sugar-=3;
				answer++;
			}
		}
		
		System.out.println(answer);

	}

}

Review🤩

빠르게 풀 수 있다고 자만했지만, 그렇게 쉬운 문제는 아니였다.


 

'Algorithm' 카테고리의 다른 글

[백준] 추월  (0) 2022.03.08
[백준] 연속부분최대곱  (0) 2022.03.01
[백준] 숫자의 합  (0) 2022.02.28
[인프런] 아나그램(해쉬)  (0) 2022.02.27
[백준] 일곱 난쟁이  (0) 2022.02.27

+ Recent posts