알고리즘 공부/백준

백준 4796번: 캠핑 (파이썬)

뚜써 2022. 1. 16. 22:23

https://www.acmicpc.net/problem/4796

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

 

문제

 

등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.

 

캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.

 

강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?

 

강산이는 조금 더 일반화해서 문제를 풀려고 한다. 

 

캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)

 

입력

 

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

 

출력

 

각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.

 

풀이

 

연속된 P일 중 처음 L일에 캠핑장을 사용하면 최대로 사용할 수 있다.

총 휴가 V일을 P로 나누면, P일을 완전히 고려할 수 있는 날들과 그렇지 않은 날들이 있다.

예를 들어 예시의 L = 5, P = 8, V = 20인 경우 처음 16일은 P일을 완전히 고려할 수 있고, 나머지 4일은 P일을 절반만 고려할 수 있다.

P일을 완전히 고려할 수 있는 날에는 L일만큼 사용할 수 있고, P일을 완전히 고려하지 못하는 날에는 남은 날이 L일보다 작거나 같다면 남은 날을 모두 사용하고, 남은 날이 L일보다 크다면 L일만 사용할 수 있다.

따라서 V를 P로 나눈 몫에 L을 곱하고, 남은 날을 경우에 따라 나눠준다.

 

소스 코드

 

case = 1
while True:
    l, p, v = input().split()
    l, p, v = int(l), int(p), int(v)
    if (l, p, v) == (0, 0, 0):
        break

    res = (v//p)*l + v%p if v%p <= l else (v//p)*l + l
    print("Case %d: %d"%(case, res))
    case += 1