알고리즘💻/그리디

BOJ 4796번: 캠핑

호프 2021. 1. 11. 22:37

www.acmicpc.net/problem/4796

 

4796번: 캠핑

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

www.acmicpc.net

아이디어:

(V // P)*L +

    If V%P > L: L

    If V%P < L: V%P

import sys

case = 0 #Case 숫자 변수
while True:
    L, P, V= map(int, sys.stdin.readline().split())
    if (L==0 and P==0 and V==0):
        break
    case+=1
    if (V%P > L):
        ans = V//P*L + L
    else:
        ans = V//P*L + V%P
    print("Case %d: %d" %(case, ans))

 

동아리 다른 사람이 짠 코드:

i=1
while (1):
    l,p,v=map(int,input().split())
    if(l+p+v==0):break
        
    n1=v//p*l
    n2=v%p
    n2=min(n2,l)
    print('Case '+str(i)+': '+str(n1+n2))
    i+=1

-> 나는 V%P가 L보다 큰 경우와 그렇지 않은 경우를 if 문으로 케이스를 나누었는데, 최솟값을 이용해 푸는 방법이 더 깔끔해 보인다. 더 이해하기도 쉬운 것 같다. 중복되는 연산도 피할 수 있다. 

 

수정한 코드:

import sys

case = 0 #Case 숫자 변수
while True:
    L, P, V= map(int, sys.stdin.readline().split())
    if (L==0 and P==0 and V==0):
        break
    case+=1
    
    n1 = V//P*L
    n2 = V%P
    ans = n1 + min(n2, L)
    
    print("Case %d: %d" %(case, ans))