문제 풀이/백준

[백준] 2885번. 초콜릿 식사(JAVA)

27200 2025. 3. 4. 22:08

문제

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


풀이(11분)

import java.io.*;
import java.util.*;

public class Main {

    // 일단 구매해야하는 가장 작은 초콜릿의 크기를 구한다.
    // 그 후 지수개만큼 채워나간다.
    // 이때, 가장 작은 초콜릿까지의 지수승을 저장해두고, 만약 된다면 바로 끝내자.
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int k = Integer.parseInt(br.readLine());

        int num = 1;
        while(num < k){
            num *= 2;
        }

        int answerNum = num;
        int answerCount = 0;
        while(k > 0){
            if(num > k){
                num /= 2;
                answerCount++;
                continue;
            }
            if(num == k){
                break;
            }
            k -= num;
        }

        System.out.println(answerNum + " " + answerCount);

    }
}

문제 풀이 전략

 

요즘 연습 중인 방법인데, 초반에 아이디어를 머릿속으로만 정리하는 것이 아니라 반드시 주석으로 작성해 두자.

특히, 문제에서 중요한 조건이 보인다면 써두자.

 

이 문제의 경우 초반에 주석으로 작성한 아이디어가 문제 해결의 전부를 담당했다.

 

풀이 순서는 다음과 같다.

1. 일단 구매해야하는 가장 작은 초콜릿의 크기를 구하자.

-> 가장 작은 초콜릿의 크기를 구하기만 한다면, 반드시 이 안에서 해결할 수 있다.(어차피 가장 작게 자르면 1개 단위로 나오기 때문)

-> 만약 이 조건들이 엮어졌다면 복잡한 문제가 될 수 있다고 생각한다.

2. k보다 num이 작아질 때까지 2로 나누어가며 이때마다 나눈 값을 추가하자.

3. 만약 k와 num이 같다면 바로 끝내면 된다.

4. k가 num보다 크다면 k에서 num만큼의 값을 빼주자.