콜라문제

나의 기록·2026년 7월 27일

코딩테스트

목록 보기
31/35

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/132267

빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개로 총 몇 병의 콜라를 받을 수 있는지 구하는 문제.

처음 짠 코드

class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        int cola = n;

        while (cola >= a) {
            n = cola / a + cola % a;
            answer += cola / a;
            cola = n;
        }

        return answer;
    }
}

예제 두 개((2,1,20)→19, (3,1,20)→9)는 통과했다.

뭘 몰랐나

매개변수로 a, b, n을 받아놓고 실제 로직에서는 an만 쓰고 있었다. b는 함수 시그니처에만 있고 계산에는 한 번도 등장하지 않음. "빈 병 a개 → 콜라 1병" 교환만 처리하는 코드였던 것.

두 예제가 우연히 둘 다 b=1이라서 잘못된 코드로도 정답이 나왔던 거고, 그래서 문제를 못 알아챘다. 매개변수를 넘겨받았으면 로직 안에서 한 번은 쓰이는 게 맞는데, 그 체크를 안 하고 넘어간 게 원인.

어떻게 알아챘나

b가 1이 아닌 값(a=5, b=3, n=20)을 손으로 직접 교환 과정을 그려보고, 그 결과를 코드 실행 결과와 비교했다. 손으로 계산한 답과 코드 결과가 다르게 나오면서 b가 계산에 반영되지 않고 있다는 걸 확인.

수정한 코드

교환할 때마다 받는 콜라 병 수(cola / a * b)와, 그 콜라가 다시 빈 병으로 합쳐지는 부분(cola / a * b + cola % a) 두 군데에 b를 곱해줘야 했다.

class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        int cola = n;

        while (cola >= a) {
            n = cola / a * b + cola % a;
            answer += cola / a * b;
            cola = n;
        }

        return answer;
    }
}

(2,1,20)→19, (3,1,20)→9, (5,3,20)→24 모두 정상 동작 확인.

배운 점

함수 작성 후 매개변수를 전부 로직에서 쓰고 있는지 체크하는 습관이 필요하다. 특히 주어진 예제 케이스가 특정 값(여기선 b=1)으로 치우쳐 있으면 버그가 있어도 통과해버릴 수 있으니, 예제와 다른 값으로 직접 케이스를 만들어 검증하는 게 중요하다.

profile
뭐든 남겨본다

0개의 댓글