문제
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
https://www.acmicpc.net/problem/4796
풀이
- V 휴가 중 최대한 많이 캠핑장을 예약하려고 한다.
- 연속 P일 이내에서는 최대 L일만 예약이 가능하다.
- 그런데 연속 P일 이후에 남은 일자에 대해서는 2가지 경우로 나누어 최대를 구할 수 있다.
- 왼쪽 그림은 P일 예약하고 남은 날짜가 L일 보다 작은 경우다. 그럼 최대 V%P 일만 예약이 가능하다.
- 오른쪽 그림은 P일 예약하고 남은 날짜가 L일 보다 큰 경우다. 그럼 최대가 되기 위해 L일 모두 예약을 하도록 처리하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Baek4796 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = 0;
while (true) {
t++;
StringTokenizer st = new StringTokenizer(br.readLine());
int L = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
if (L == 0 && P == 0 && V == 0) {
return;
}
int ans = 0;
ans = (V / P) * L ;
if(V % P < L) {
ans += V % P;
} else {
ans += L;
}
System.out.println("Case " + t + ": " + ans);
}
}
}
|
cs |
정리
- 처음문제 풀었을 때 남은 예약가능 날짜를 V % P로만 계산했더니 계속 틀렸다.
- 입력 값에 대해 다양한 상황을 고려해서 풀어야겠다.
- 그리고 몫, 나머지에 대해서 위 설명처럼 그림으로 정리하니 금방 이해가 됐다.
'CS > 알고리즘 풀이' 카테고리의 다른 글
[우선순위 큐][백준 1655] 가운데를 말해요 (0) | 2024.10.17 |
---|---|
[백준 9251][DP] LCS (0) | 2024.06.27 |
[프로그래머스 Java]가장 많이 받은 선물 (1) | 2024.06.14 |
[프로그래머스 자바] 유사 칸토어 비트열 (0) | 2024.05.27 |
[백준 2805] 나무 자르기 (0) | 2024.05.11 |