코딩 테스트 연습/[프로그래머스] Python

[LV.3] 연습문제 > 콜라 문제

duswjd_data 2025. 7. 17. 20:56

문제

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

 

프로그래머스

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

programmers.co.kr


문제 설명

  • 마트에서는 빈 병 a개를 가져오면 콜라 b병을 줍니다.
    상빈이는 현재 빈 병 n개를 가지고 있으며, 이 병들을 최대한 교환해 콜라를 받고 싶어 합니다.
  • 콜라를 마신 후 병은 다시 사용할 수 있으므로, 빈 병이 a개 이상일 때까지 계속 교환이 가능합니다.
  • 이때 상빈이가 받을 수 있는 총 콜라 병 수를 구하시오.
  • 제한사항
    1 ≤ b < a ≤ n ≤ 1,000,000
    정답은 항상 int 범위를 넘지 않게 주어집니다.

정답 코드

def solution(a, b, n):
    total = 0
    while n >= a:
        exchange = (n//a)*b     # 교환해서 받는 콜라 병 수
        total += exchange       # 총 콜라 개수 누적
        n = (n % a) + exchange  # 남은 빈 병 + 새로 마신 콜라의 빈 병
    return total

  1. n >= a일 때까지 계속 반복
  2. n // a번의 교환이 가능하고, 이때마다 b병씩 받으므로 exchange = (n // a) * b
  3. 콜라 병을 받은 만큼 total에 누적
  4. 교환에 쓰고 남은 병 (n % a)과 새로 마신 콜라 병 exchange를 더해서 다시 n에 할당
  5. 반복을 종료하면 총 받은 콜라 병 수가 total

첫 번째 시도 (실패)

def solution(a, b, n):
    answer = 0
    mid = 0
    while n >= a:
        mid = (n//a)+(n-a*(n//a))
        answer += (n//a)*b
    return answer

문제점

  • 무한 루프 발생) n의 값이 while n >= a: 루프 안에서 변하지 않기 때문에 무한히 반복 → n을 업데이트 해야 됨

두 번째 시도 (테스트 통과 : 2/14개)

def solution(a, b, n):
    answer = 0
    mid = 0
    while n >= a:
        mid = (n//a)+(n-a*(n//a))
        answer += (n//a)*b
        n=mid
    return answer

문제점

  • 데이터 입출력 예시에서 b의 값이 1이라, b를 곱해야 된다는 것을 생각하지 못함

세 번째 시도 (성공. 개선 필요)

def solution(a, b, n):
    answer = 0
    mid = 0
    while n >= a:
        mid = (n//a)*b + (n-a*(n//a))
        answer += (n//a)*b
        n=mid
    return answer
  • 작동은 되지만 가독성이 떨어지므로 개선 필요