알고리즘 연습/구현, 문자열

[🥈5 / 백준 4796 / 파이썬] 캠핑

김세진 2021. 8. 12. 05:40
반응형

 

 

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개 주어진다.

출력

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

 

예제 입력 

5 8 20
5 8 17
0 0 0

예제 출력 

Case 1: 14
Case 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="")
반응형