문제
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
'알고리즘' 카테고리의 다른 글
[프로그래머스] N개의 최소공배수 - 파이썬/python (0) | 2025.01.19 |
---|---|
[프로그래머스] 주식가격 - 파이썬/python (0) | 2024.11.27 |
[프로그래머스] 신고 결과 받기 - 파이썬/python (1) | 2024.11.19 |
[프로그래머스] 크레인 인형뽑기 게임 - 파이썬/python (0) | 2024.11.11 |
[프로그래머스] 키패드 누르기 - 파이썬/python (0) | 2024.11.06 |