실패 | 시도 - 번
4796 : [그리디 알고리즘] 캠핑(py)
문제 설명
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
문제 분석
입력 예시 1 : Case 1
휴가 : 20일
연속하는 8일 중 5일동안만 사용 가능
→ 8일 주기로 캠핑장을 갈 수 있다.
20 // 8 = 2 : 8일 주기로 가면 캠핑장에 있는 실질적인 일수는 2 * 5일이다.
20 % 8 = 4 : 20일을 8일 주기로 나누었을 때 남은 4일 휴가 때도 캠핑장을 갈 수 있다.
그래서 최종적으로 캠핑장에 최대 2 * 5 + 4 = 14일을 있을 수 있다.
입력 예시 2 : Case 2
휴가 : 17일
연속하는 8일 중 5일동안만 사용 가능
→ 8일 주기로 캠핑장을 갈 수 있다.
17 // 8 = 2 : 8일 주기로 가면 캠핑장에 있는 실질적인 일수는 2 * 5일이다.
17 % 8 = 1 : 17일을 8일 주기로 나누었을 때 남은 1일 휴가 때도 캠핑장을 갈 수 있다.
그래서 최종적으로 캠핑장에 최대 2 * 5 + 1 = 11일을 있을 수 있다.
추가 예시 : Case 3
휴가 : 21일
연속하는 6일 중 2일동안만 사용 가능
→ 8일 주기로 캠핑장을 갈 수 있다.
21 // 6 = 3 : 6일 주기로 가면 캠핑장에 있는 실질적인 일수는 6 * 3일이다.
21 % 6 = 3 : 21일을 6일 주기로 나누었을 때 휴가가 3일이 남지만 6일 중에 2일동안만 사용 가능하기 때문에 2일만 캠핑장을 갈 수 있다.
그래서 최종적으로 캠핑장에 최대 2 * 3 + 2 = 8일을 있을 수 있다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순0 서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
출력
각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.
입력과 출력 예시
입력 | 출력 |
5 8 20 5 8 17 0 0 0 |
Case 1: 14 Case 2: 11 |
내 소스
- 첫시도 : 실패 (구현 실패)
result = []
while True:
L, P, V = map(int, input().split())
if L + P + V == 0:
break
count = V // P
if V % P >= L:
vacation = count * L + L
else:
vacation = count * L + V % P
result.append(vacation)
for i in range(len(result)):
print(f'Case {i+1}: {result[i]}')
소스 설명
result = []
while True:
L, P, V = map(int, input().split())
if L + P + V == 0:
break
count = V // P
if V % P >= L:
vacation = count * L + L
else:
vacation = count * L + V % P
result.append(vacation)
[1 - 11]
- 얼만큼 입력을 받을지 모르기 때문에 while 문을 사용한다.
- L, P, V 값을 각각 입력받는다.
- 만약 L, P, V의 합이 0이면 while 문을 멈춘다. L, P, V가 모두 0이면 그의 합은 0이다. 조건식을 간결히 쓰기 위해 합을 이용했다. 입력 마지막이 '0 0 0'인 이유는 입력 횟수를 조절하기 위함인 것 같다.
- if (L == 0) and (P == 0) and (V == 0):
- if L + P + V == 0:
- 휴가일(V)를 주기(P)로 나눈 나머지가 캠핑장 이용가능일(L)보다 크거나 같으면 휴가일(V) // 주기(P)에 캠핑장 이용가능일(L)을 더해준다.
- 반대로, 휴가일(V)를 주기(P)로 나눈 나머지가 캠핑장 이용가능일(L)보다 작으면 휴가일(V) // 주기(P)에 휴가일(V) % 주기(P)를 더해준다.
- 실질적인 캠핑 이용일은 result 리스트에 저장한다.
for i in range(len(result)):
print(f'Case {i+1}: {result[i]}')
[12 -13] : 입력에 대한 출력값을 형식에 맞게 출력한다.
다른 코드 분석
- [1] 작성자분은 if문 대신 min() 함수를 사용하였다. if 문을 min()으로 표현하니 훨씬 간결하게 작성할 수 있어 신기했다. 또 while 문 안에 print() 함수를 사용하여 입력 받은 것에 대해 바로 출력할 수 있게 코딩하였다.
- [2] 작성자분은 if문을 사용했지만 엄청 간결하게 작성하였다.
회고
- 난이도가 그렇게 어려운 문제가 아니였는데 문제 이해를 잘못해서 계속 삽질을 했었다.
- 처음 코딩할 때 for문을 사용해서 입력 횟수를 3으로 제한했었다.다른 분들의 방식을 보고 입력 횟수를 3으로 제한할 게 아니라 특정 조건일 때 멈추는 방식으로 코딩해야 한다는 것을 알았다. 입력 예시에 왜 '0 0 0'이 있는지 뒤늦게 이해하고 코드를 수정했다.
- 비교하는 문제에 대해서 min() 함수로 작성하는 연습을 해야할 것 같다. min() 함수를 통해 코드를 간결하게 표현할 수 있다는 것을 알게 되었다.
Ref.
1. 문제 풀이 / https://alpyrithm.tistory.com/133
2. 문제 풀이 / https://hongcoding.tistory.com/28
3. 문제 풀이 / https://jokerldg.github.io/algorithm/2021/03/13/camping.html
4. 문제 풀이 / https://data-flower.tistory.com/26
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 문제 풀고 자동으로 깃허브 커밋하기 (0) | 2023.01.29 |
---|---|
[코테/백준] Python 기타줄 - 1049번 (0) | 2023.01.27 |
[코테/백준] Python 수 묶기 - 1744번 (0) | 2023.01.27 |
[코테/백준] 레벨 기록 (0) | 2023.01.27 |
[코테/백준] Python 30 - 10610번 (0) | 2023.01.24 |