
문제
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
- n >= a일 때까지 계속 반복
- n // a번의 교환이 가능하고, 이때마다 b병씩 받으므로 exchange = (n // a) * b
- 콜라 병을 받은 만큼 total에 누적
- 교환에 쓰고 남은 병 (n % a)과 새로 마신 콜라 병 exchange를 더해서 다시 n에 할당
- 반복을 종료하면 총 받은 콜라 병 수가 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
- 작동은 되지만 가독성이 떨어지므로 개선 필요
'코딩 테스트 연습 > [프로그래머스] Python' 카테고리의 다른 글
| [LV.3] 연습문제 > 2016년 (3) | 2025.07.23 |
|---|---|
| [LV.3] 연습문제 > 명예의 전당 (1) ⭐️ (1) | 2025.07.21 |
| [LV.3] 연습문제 > 푸드 파이트 대회 (0) | 2025.07.15 |
| [LV.3] 연습문제 > 가장 가까운 같은 글자 ⭐️ (1) | 2025.07.11 |
| [LV.3] 월간 코드 챌린지 시즌1 > 두 개 뽑아서 더하기 (1) | 2025.07.10 |