알고리즘

[프로그래머스] 콜라 문제 - 파이썬/python

욘아리 2024. 11. 25. 16:59

https://school.programmers.co.kr/learn/courses/30/lessons/132267

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

빈 병 a개를 가져다주면 콜라 b병을 줄 때, 교환하면서 받을 수 있는 콜라 병의 총 개수를 구하는 문제다.

 

제한사항
  • 1 ≤ b < a ≤ n ≤ 1,000,000
  • 정답은 항상 int 범위를 넘지 않게 주어집니다.

 

예시

Example 1:

a: 2
b: 1
n: 20
result: 19

이해를 돕기 위한 예시 사진

 

Example 2:

a: 3
b: 1
n: 20
result: 9

 

풀이

처음에는 divmod를 사용해 몫과 나머지를 계산하고, 교환 과정을 구현했다.

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        n, mod = divmod(n, a)  # 빈 병으로 교환 후 몫(n)과 나머지(mod) 계산
        answer += n            # 몫만큼 콜라 병을 누적
        n += mod               # 교환 후 남은 나머지를 다시 n에 더함
    
    return answer
  • 여기서 빈 병을 가져갔을 때 1병만 받을 수 있다는 예제만 참고하느라 b 값을 고려하지 않아 실패했다.

 

수정된 코드(통과)

문제 조건을 다시 읽고, 교환 시 새 병 b개를 받을 수 다는 점을 반영했다.

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        n, mod = divmod(n, a)
        n = n * b              # 몫에 b를 곱해 교환 가능한 병 수 계산
        answer += n            # 교환된 병 수를 누적
        n += mod               # 남은 나머지를 다시 추가
    
    return answer

 

최종 코드

위의 코드도 통과는 했지만, n을 반복적으로 갱신하면서 가독성이 떨어져 보여 간단하고 직관적으로 문제를 해결했다.

def solution(a, b, n):
    answer = 0
    
    while n >= a:
        answer += (n // a) * b  # 교환된 병의 수를 바로 누적
        n = (n // a) * b + (n % a)  # 교환 후 남은 병 수 갱신
    
    return answer