haju__log

[python][백준/BOJ] 4796번 : 캠핑 본문

BOJ_백준/그리디

[python][백준/BOJ] 4796번 : 캠핑

haju 2023. 10. 1. 18:31
반응형

https://www.acmicpc.net/problem/4796

 

4796번: 캠핑

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

www.acmicpc.net

✅ 문제풀이

  • 아래 그림을 보면서 문제를 해석해보자.

  • 예제 1에서는 연속 8일 중 5일을 선택해야하는데, 총 20일이므로,
  • 8일 / 8일 / 나머지 4일로 쪼개서 볼 수 있다. 
  • 그러면 두 번의 8일에서는 두 번 다 5일을 사용할 수 있고,
  • 마지막 4일에서는 5일보다 작으므로 4일 모두 사용할 수 있다.
  •  
  • 예제 2에서는 총 17일이므로, 8일 / 8일 / 나머지 1일로 쪼개서 볼 수 있다. 
  • 위와 마찬가지로 두 번의 8일에서는 5일씩 사용할 수 있고, 나머지 1일을 사용할 수 있다. 

✅ 첫 번째 시도 

import sys

check=1
while True:
    l,p,v=map(int,sys.stdin.readline().split())
    if l==p==v==0:
        break
    print("Case %d: %d" %(check,v//p*l+v%p))
    check+=1

❗ 틀린 이유 : 

반례 > 

  • input > 5 15 40
  • answer > 15
  • output > 20 
  • 온전한 p일 중에서 l일을 선택하는 식은 v//p가 맞음 
  • 그러나 가능한 나머지 일수를 세는 방식이 틀렸다. 
  • 나머지 가능한 날짜 수가 9이고, 선택가능한 l일이 5라면 최대 5일까지만 가능한 것인데, 내가 작성한 코드는 9일을 모두 세는 방법이었기에 틀린 코드였던 것이다...!

 

✅ 최종코드

  • 가능한 나머지 일수를 세는 방식을 조건문을 두어
  • 나머지 값이 만약 l일보다 크다면 l일까지만 세고
  • 나머지 값이 l일보다 작거나 같다면 나머지 값을 그대로 저장한다.  
import sys

check=1
while True:
    l,p,v=map(int,sys.stdin.readline().split())
    if l==p==v==0:
        break
    result=v//p*l
    if v%p>l:
        result+=l
    else:
        result+=v%p
    print("Case %d: %d" %(check,result))
    check+=1
반응형

'BOJ_백준 > 그리디' 카테고리의 다른 글

[python][백준/BOJ] 2839번 : 설탕 배달  (2) 2023.09.07
[python][백준/BOJ] 11399번 : ATM  (0) 2023.09.06