문제 링크: 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을 받아놓고 실제 로직에서는 a와 n만 쓰고 있었다. 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)으로 치우쳐 있으면 버그가 있어도 통과해버릴 수 있으니, 예제와 다른 값으로 직접 케이스를 만들어 검증하는 게 중요하다.