2024. 8. 30. 18:00ㆍ코딩테스트 입문
https://school.programmers.co.kr/learn/courses/30/lessons/120884
문제 설명
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
제한사항
- chicken은 정수입니다.
- 0 ≤ chicken ≤ 1,000,000
입출력 예
chicken | result |
100 | 11 |
1081 | 120 |
입출력 예 설명
입출력 예 #1
- 100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
- 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
- 따라서 10 + 1 = 11 을 return합니다.
입출력 예 #2
- 1081마리를 주문하면 쿠폰이 1081장 발급되므로 서비스 치킨 108마리를 주문할 수 있습니다. 그리고 쿠폰이 1장 남습니다.
- 108마리를 주문하면 쿠폰이 108장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다. 그리고 쿠폰이 8장 남습니다.
- 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
- 1마리를 주문하면 쿠폰이 1장 발급됩니다.
- 가지고 있는 쿠폰이 총 10장이므로 서비스 치킨 1마리를 추가로 주문할 수 있습니다.
- 따라서 108 + 10 + 1 + 1 = 120 을 return합니다.
쿠폰으로 받을 수 있는 서비스 치킨의 개수를 찾는 문제입니다.
처음에는 문제를 잘못 읽어서 바로 chicken을 10으로 나눈 몫들을 전부 반환하면 되는 문제 아닌가 했는데, 쿠폰이 남았을 때 그걸 보충할 수 있으면 또 시킬 수 있다는 걸 생각 못했었습니다.
예제 2번에서도 잘 나와있는 것처럼 남겨둔 쿠폰들을 합쳐서 다시 치킨을 시킬 수 있습니다. 그래서 남은 쿠폰들을 계산해두는 게 중요하죠.
이 문제에서 특히 오류가 자주 나는 부분은 1999 - 222인 것 같습니다.
마지막에 28개의 쿠폰이 있는데, 20개로 2마리를 더 시키면 8 + 2로 1마리를 더 시킬 수 있기 때문입니다.
아래의 코드를 보시기 전에 1999, 222를 검증해보시기 바랍니다.
파이썬으로 문제를 풀어보겠습니다.
def solution(chicken):
# 서비스로 받은 answer, 쿠폰의 개수 coupon
answer, coupon = 0, chicken
# 쿠폰의 개수가 10개 이상일 때
while coupon >= 10:
# 서비스로 10개마다 1개씩을 받습니다.
answer += coupon // 10
# 남은 쿠폰은 현재 쿠폰으로 시킨 서비스 치킨(coupon // 10)
# + 쿠폰의 남은 개수(coupon % 10)
coupon = coupon // 10 + coupon % 10
return answer
coupon이 10개 이상일 때만 서비스 치킨을 주문할 수 있습니다.
answer에는 쿠폰으로 시킨 치킨의 개수를 추가해주고, coupon에는 서비스로 시킨 몫(coupon // 10), 남은 쿠폰의 개수(coupon % 10)을 더해서 계산합니다.
이게 왜 안 되지? 하고 당황해서 시간이 좀 걸렸네요. 생각보다 까다로웠습니다.