본문 바로가기

공부하는 것들/알고리즘

백준 4796 : 캠핑(그리디)

www.acmicpc.net/problem/4796

 

4796번: 캠핑

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

www.acmicpc.net

 

Input : L, P, V (연속하는 P일 중, L일 동안 사용 가능, V일 짜리 휴가) (1<L<P<V)

 

Output : ans = 캠핑장 사용 가능일수

             Case i: ans. 

 

 

풀이 :

연속하는 P일을 캠핑장 사용의 단위라 생각할 수 있다.

휴가일이 단위 P일보다 길 경우, P일동안 사용할 수 있는 L일을 모두 사용할 수 있다.

즉, 휴가일이 P일보다 길 경우, P일로 나눠떨어지는 횟수(q) 동안 매번 L일 캠핑장을 사용할 수 있따.

나머지일 중에 캠핑장을 사용할 수 있는 경우를 모두 사용한다 : min(L,V)

 

V<=P : ans = min(L,V)

 

V > P : q,r = (V,P)

          ans = q*L + min(r,L)

 

단, 테스트 케이스 갯수가 주어지지 않으므로 while문을 이용해서 받고, cnt 변수를 통해 몇개의 case가 있는 지 기록한다.

 

def solve(t):
    L,P,V = t
    if V<=P: ans = min(L,V)
    else: 
        q,r = divmod(V,P)
        ans = q*L + min(r,L)
    return ans
        

if __name__=='__main__':
    T = []
    while True:
        case = list(map(int,input().split()))
        if case==[0,0,0]: break
        T.append(case)
        
    for i in range(len(T)):
        ans = solve(T[i])
        print('Case {0}: {1}'.format(i+1,ans))