[코딩테스트]그리디-캠핑(4796번)

naring·2023년 8월 17일
0

코딩테스트

목록 보기
4/12
post-thumbnail

백준 4796번 캠핑

문제

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

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

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

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

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

5 8 20
5 8 17
0 0 0

Case 1: 14
Case 2: 11

최대한 많이 사용하려면

p일동안 L일을 모두 사용하면 된다. 이는 이 다음 p일에 영향을 미치지 않기 때문에 이렇게 그리디로 풀면 되는 문제이다.
그러면 V일 중 앞선 P일에는 모두 L일 만큼 사용하고, 마지막에 P일 이하로 남는 일수에는 최대 L일 사용하는 것으로 코드를 짜면 되겠다.

코드

cases = []
while True:
  L, P, V = map(int, input().split())
  if L == 0 and P == 0 and V == 0:
    break
  cases.append([L, P, V])

use = 0
answers = []
for L, P, V in cases:
  use += (V // P) * L
  rest = V - P * (V // P)
  if (rest > L):
    use += L
  else:
    use += rest
  answers.append(use)
  use = 0

for a in range(len(answers)):
  print("Case {0}: {1}".format(a+1, answers[a]))

리뷰

처음에는 answers 리스트에 append를 rest로 잘못했고 ... (으이구)
그리고 남은 날짜를 빼줄 때 계산을 잘못해서 계속 다른 숫자가 나왔다!

참고할만한 사항은 000이 나오면 입력이 종료된다는 조건에서 L,P,V를 삽입하기 전에 break이 되도록 한다는 점과, python에는 do while문이 없으니까 while True로 하고 break조건을 준다. 그리고 문자열 포멧팅을 활용하면 쉽게 조건대로 프린트 가능하다!

짜란

profile
개발은 즐거워

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기