코드
def solution(a, b, n):
answer = 0 # 받은 병의 개수
while n >= a:
answer += (n // a) * b
n = (n // a) * b + (n % a)
return answer
a개의 병을 가져다주면 b개의 병으로 바꿔준다.
n개의 병을 가지고 있을 때, 총 몇 개의 병을 받을 수 있는지 구하는 문제이다.
문제에서 주어진 예시(a=2, b=1, n=20)를 가지고 설명하자면 다음과 같다.
a=2, b=1 이므로, 2개를 가져다주면 1개로 바꿔준다. 20개(=n)의 병을 가지고 있을 때, 총 몇 개의 병을 받을 수 있을까?
1) 20개를 모두 가져가 10개로 바꾼다. → (20 // 2) * 1 = 10
- 바꾼 병의 개수 answer = 10
- 현재 가지고 있는 병의 개수 n = 10
2) 10개를 모두 가져가 5개로 바꾼다. → (10 // 2) * 1 = 5
- 바꾼 병의 개수 answer = 10 + 5 = 15
- 현재 가지고 있는 병의 개수 n = 5
3) 5개 중 4개를 가져가 2개로 바꾼다. → (5 // 2) * 1 = 2
- 바꾼 병의 개수 answer = 10 + 5 + 2 = 17
- 현재 가지고 있는 병의 개수 n = 3
5개를 가지고 갔을 때 바꿀 수 있는 개수는 (5 // 2) * 1로 2개이고 남은 병의 개수는 5 % 2로 1개이므로 총 3개이다.
4) 3개 중 2개를 가져가 1개로 바꾼다. → (3 // 2) * 1 = 1
- 바꾼 병의 개수 answer = 10 + 5 + 2 + 1 = 18
- 현재 가지고 있는 병의 개수 n = 2
3개를 가지고 갔을 때 바꿀 수 있는 개수는 (3 // 2) * 1로 1개이고 남은 병의 개수는 3 % 2로 1개이므로 총 2개이다.
5) 2개를 모두 가져가 1개로 바꾼다. → (2 // 2) * 1 = 1
- 바꾼 병의 개수 answer = 10 + 5 + 2 + 1 + 1 = 19
- 현재 가지고 있는 병의 개수 n = 1
6) 현재 가지고 있는 병의 개수인 n이 a보다 작다. 문제에서 "보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다."라고 제시했으므로 과정을 마친다.
n개의 병을 가지고 바꿀 수 있는 병의 개수는 (n // a) * b 개 이다.
이렇게 병을 바꾸고 난 뒤, 가지고 있는 병의 개수는 바꾼 병 + 남은 병이므로 (n // a) * b + (n % a) 개다.
병을 바꿀 때마다 answer에는 바꾼 병의 개수를 추가해 주고, n은 바꾼 병 + 남은 병으로 갱신해 준다.
위 과정을 n이 a 이상일 때까지 반복해 주고, a보다 작아지면 반복을 멈추고 바꾼 병의 개수 answer를 리턴해주면 된다.
이때 주의할 점은 while 문 안에서 answer가 n에 따라 달라지기 때문에 n을 먼저 갱신해 주면 안 된다.
n을 먼저 갱신해 주면 answer에는 처음 가진 병으로 바꾼 병의 개수를 담지 못해 원하는 답을 구할 수 없다.
그러므로 answer를 먼저 정의해 주고 n을 정의해야 한다.