문제
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
출력
각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.
예제 입력5 8 205 8 17 0 0 0 |
예제 출력Case 1: 14Case 2: 11 |
풀이
예제를 이용한 그림을 먼저 보도록 하자.
캠핑장의 주기는 8일이고 그동안 5일을 캠핑할 수 있다.
휴가는 20일 까지므로 위의 표대로라면 5+5+4 = 14일을 사용할 수 있다.
위 그림의 각 구간을 막대로 보면 공식으로 쉽게 표현할 수 있다.
휴가가 총 20일이므로 캠핑장 기간인 8일로 나눈 몫을 구하면 2가 되고, 이를 5일로 곱하면 10이 된다.
즉, V//P * L 이다.
휴가일수가 충분한 두 막대의 기간을 구했다. 마지막 막대만 구하면 된다.
마지막 막대는 남은 휴가일수가 캠핑장을 사용할 수 있는 시간보다 적을수도, 많을 수도 있다.
위의 경우는 캠핑장 이용 가능 일수보다 휴가일수가 더 적으므로 5일이 아닌 4일만 사용되었다.
만약 휴가가 21일이상, 24일 이하였다면 5일을 모두 사용했을 것이다.
따라서 마지막에 남은 휴가일수와 캠핑장 이용 가능 기간 둘 중 더 적은 것이 마지막 막대의 이용 시간이 된다.
즉, min(L, V - V//P * P) 이다.
위 두 공식을 합치면 원하는 결과가 나온다.
import sys
input = sys.stdin.readline
cnt = 0
while(True):
cnt += 1
l,p,v = map(int,input().split())
if (l,p,v) == (0,0,0):
break
print("Case ",cnt,": ",v//p*l + min(l,v-v//p*p), sep="")
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥈4 / 백준 11656 / 파이썬] 접미사 배열 (0) | 2021.08.15 |
---|---|
[🥈4 / 백준 1026 / 파이썬] 보물 (0) | 2021.08.13 |
[🥈5 / 백준 1094 / 파이썬] 막대기 (0) | 2021.08.11 |
[🥈4 / 백준 13268 / 파이썬] 셔틀런 (0) | 2021.08.03 |
[🥈5 / 백준 18311 / 파이썬] 왕복 (0) | 2021.08.02 |