문제
https://www.acmicpc.net/problem/4796
4796번: 캠핑
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
www.acmicpc.net
문제
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
출력
각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.
예제 입력 1
5 8 20
5 8 17
0 0 0
예제 출력 1
Case 1: 14
Case 2: 11
코드
package practice;
import java.util.*;
import java.io.*;
public class c6_4796 {
static StringBuilder sb = new StringBuilder();
static void input() {
FastReader scan = new FastReader();
caseNumber = 1;
while(true) {
l = Integer.parseInt(scan.next());
p = Integer.parseInt(scan.next());
v = Integer.parseInt(scan.next());
if (l == 0 && p ==0 && v ==0) break;
maxDays = (l*(v/p)) + Math.min(l, v%p);
sb.append("Case "+caseNumber + ": "+maxDays+"\n");
caseNumber++;
}
System.out.println(sb);
}
static int l, p, v, caseNumber, maxDays;
public static void main(String[] args) {
input();
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch(IOException e) {
e.printStackTrace();
}
return str;
}
}
}
설명
- 다른 문제들의 경우 테스트 케이스의 갯수를 입력받도록 되어 있는데 이 문제에서는 테스트 케이스 갯수를 입력받지를 않았다. 이걸 카운트해서 나중에 프린트 하는데 이 부분을 어떤 식으로 처리해야 할 지 몰랐었음.
=> 해결: while 문을 이용하고, break 조건만 추가
- 엣지 케이스 추가로 생각하기
처음에는 아래 처럼 작성했다. 그랬더니 3초? 만에 바로 틀렸습니다가 떠버리더라..
maxDays = (l*(v/p)) + (v%p);
그래서 확인해보니 추가로 생각해야 할 케이스가 있었다.
문제에서 주어진 이용가능한 일 수(l) 과 남은 일 수(v%p) 를 비교했을 때 남은 일 수가 작을 수 있기 때문에 자바의 Math.min 을 이용해서 해당 값을 재정의 해줘야 한다.
'Coding Test > JAVA' 카테고리의 다른 글
| Intellij 단축키 (0) | 2024.06.23 |
|---|---|
| [JAVA] 백준 16198 에너지 모으기 (0) | 2023.05.30 |