✳️ 코드 작성
🤔 코드 아이디어
1. 교환한 병 개수를 카운팅하기 위한 빈 변수 설정
2. while문을 이용해서 n이 a 이상일 때까지만 루프가 돌도록 설정(a 미만인 경우 교환 불가가 제한 사항)
3. 갖고 있는 빈 병의 개수를 교환 가능한 새 병의 개수로 나눈 몫을 변수에 더함
4. 3번 결과와 교환하고 남은 병을 더해서 새롭게 n을 업데이트
5. n이 a 미만이 될 때 까지 반복 후 끝나면 변수 반환
💟 코드 풀이
def solution(a, b, n):
answer = 0
while n >= a:
answer += (n // a) * b
n = (n // a) * b + (n % a)
return answer
🟣 answer = 0
- answer 변수를 0으로 초기화
- 최종적으로 얻을 수 있는 새 병의 총 개수를 저장하는 역할
🟣 while 루프
- n이 a 이상일 때(즉, 병을 교환할 수 있을 때까지) 루프가 계속 됨
- 병이 a개 미만이면 더 이상 새 병을 받을 수 없으므로 루프가 종료
🟣 answer += (n // a) * b (빈 병 교환)
- n // a는 현재 가지고 있는 병 n을 a로 나눈 몫을 계산하여, 몇 번 병을 교환할 수 있는지를 나타냄
- n // a * b는 그 몫에 b를 곱하여 새로 얻을 수 있는 병의 개수를 계산
🟣 n = (n // a) * b + (n % a) (병의 총 개수 업데이트)
- 병을 교환한 후 남은 병의 총 개수를 업데이트하는 부분
- n // a * b: 교환을 통해 얻은 새 병의 수
- n % a: 병을 교환한 후 남은 병의 수 (a로 나눈 나머지)
🟣 answer 반환
- 얻은 새 병의 수를 answer에 더해진 것을 반환
💠 예시
solution(2, 1, 20)
🔵 초기 n = 20
🔵 작동 과정
- 20개의 병 중 2개를 내고 1개를 받는 규칙으로 교환을 시작
1️⃣ 첫 번째 교환
- 20 // 2 = 10 (교환 가능 횟수)
- 10 * 1 = 10 (얻은 새 병 → answer에 10 저장)
- 남은 병 : 20 % 2 = 0 (교환하고 남은 병)
- 업데이트된 n = 10 + 0 = 10
2️⃣ 두 번째 교환
- 10 // 2 = 5 (교환 가능 횟수)
- 5 * 1 = 5 (얻은 새 병 → answer에 5 더하기)
- 남은 병 : 10 % 2 = 0
- 업데이트된 n = 5 + 0 = 5
3️⃣ 세 번째 교환
- 5 // 2 = 2 (교환 가능 횟수)
- 2 * 1 = 2 (얻은 새 병 → answer에 2 더하기)
- 남은 병 : 5 % 2 = 1
- 업데이트된 n = 2 + 1 = 3
4️⃣ 네 번재 교환
- 3 // 2 = 1 (교환 가능 횟수)
- 1 * 1 = 1 (얻은 새 병 → answer에 1 더하기)
- 남은 병 : 3 % 2 = 1
- 업데이트된 n = 1 + 1 = 2
5️⃣ 마지막 교환
- 2 // 2 = 1
- 1 * 1 = 1 (얻은 새 병 → answer에 1 더하기)
- 남은 병 : 2 % 2 = 0
- 업데이트된 n = 1 + 0 = 1
- 이제 더 이상 병을 교환할 수 없으므로 종료
🔵 최종 반환
- 총 얻은 병의 수는 10 + 5 + 2 + 1 + 1 = 19
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Python] 소수 만들기 (0) | 2024.10.02 |
---|---|
[Python] 모의고사 (0) | 2024.10.02 |
[Python] 푸드 파이트 대회 (0) | 2024.09.26 |
[Python] 가장 가까운 같은 글자 (0) | 2024.09.25 |
[Python] 두 개 뽑아서 더하기 (0) | 2024.09.20 |