문제
정답 소스코드 (Python)
cnt=1
while True:
l,p,v=map(int,input().split())
if l==p==v==0:break
result= l*(v//p)+l if v%p>l else l*(v//p)+v%p
print(f"Case {cnt}: {result}")
cnt+=1
풀이 (Python)
문제이해가 어려운 문제일 수도 있다. 문제의 예시로 아래에 설명하겠다.
좌측과 같이 28일의 휴가가 있다고 할 때 여기서의 분홍색은 휴가를 의미한다.
20일 중 10일만 사용 가능하므로 캠핑장을 이용하는 날짜는 파란색에 해당된다. 20일 중에 10일은 어느 날짜를 이용해도 상관없다.
20일 중 10일은 어떤 날짜를 이용해도 상관없고, 최대로 사용가능한 날짜를 구하기 위해서는 좌측과 같이 나머지 남는 칸은 모두 이용해야 한다.
이와 같은 문제 이해를 바탕으로 다시 문제를 접근해 보면, 결과적으로 P일로 휴가를 나눈 몫과 L일을 곱한 것과 나머지 최대로 이용할 수 있는 부분을 더해주면 된다.
그때 나머지 최대로 이용할 수 있는 부분은 V% P( 휴가를 P로 나눈 나머지)라고 생각하기 쉽지만, 이와 같이 작성하는 경우 아래와 같은 반례 케이스가 존재한다.
입력: 2 8 20
출력: 8
정답: 6
P로 휴가를 나누면 몫은 2 나머지는 4이다. 이런 경우 2*L+4를 하는 것이 아닌, 2*L+L 이여야 한다.
이를 해결하기 위해서 result= l*(v//p)+l if v% p> l else l*(v//p)+v% p을 추가해 주었다. 이는 한 줄로 if문 처리를 해주었을 뿐 실제로 다음과 같다.
if v%p>l:
result= l*(v//p)+l
else:
result=l*(v//p)+v%p
'Baekjoon' 카테고리의 다른 글
[백준] 1205번 등수 구하기 (파이썬) (1) | 2024.02.10 |
---|---|
[백준] 5585번 거스름돈 (파이썬) (0) | 2024.02.07 |
[백준] 11399번 ATM (파이썬) (1) | 2024.02.06 |
[백준] 11651 좌표 정렬하기2 (파이썬) (0) | 2024.02.06 |
[백준] 2750번 수 정렬하기 (파이썬) (1) | 2024.02.06 |