일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Exception
- Servlet
- 스프링 핵심 기능
- Spring Boot
- JPQL
- 자바
- 백준
- 인프런
- JDBC
- java
- jpa
- springdatajpa
- spring
- kotlin
- Greedy
- pointcut
- 스프링 핵심 원리
- http
- 그리디
- transaction
- QueryDSL
- AOP
- Proxy
- SpringBoot
- 알고리즘
- 스프링
- Thymeleaf
- db
- Android
- 김영한
- Today
- Total
개발자되기 프로젝트
[백준] Greedy: 캠핑 본문
문제
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
출력
각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.
문제 접근.
문제 이해가 잘 안되었다.
문제에 예시로 "연속하는 20일 중 10일동안 만 사용할 수 있다"고 나왔다.
이 뜻이 20일 중 10일만 사용이 가능한건지, 10일까지 사용이 가능한 것이지 구분이 안되었다.
이 상태로 아래 예시를 봤다.
아래 예시는 다음과 같음과 같은 뜻으로 이해되었다.
case1: 20일 내에서 연속 8일 2번 가능. 남은 4일 가능. --> (20/8)*5+(20%8)
case1: 20일 내에서 연속 8일 2번 가능. 남은 1일 가능. --> (20/8)*5+(20%8)
위에선 20일 중 10일 만 가능하다고 했는데...헷갈린다. 남은 일자는 모두 쓸 수 있는건가..말이 안맞는다..
예시에서 확인한 로직대로 작성해 보았따.
package baekjun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _4796 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int caseNumber = 1;
while(true){
String s = br.readLine();
if (s.equals("0 0 0")) break;
String[] caseString = s.split(" ");
int[] each = new int[3];
for (int i=0; i<3; i++){
each[i] = Integer.parseInt(caseString[i]);
}
int answer = (each[2] / each[1])*each[0] + each[2]%each[1];
System.out.println("Case "+caseNumber+": "+answer);
caseNumber++;
}
}
}
진행 하다가 에러가 나는 것을 보니 문제의 의도는 "20일 중 10일까지 사용이 가능하다." 이다.
즉 이 말은 10일까지 사용이 가능한 경우는 20일이 확보되었을 경우이다.
대우로 20일이 확보되지 않으면 10일까지 사용을 못한다. --> 그럼 언제까지라는겨
그러면 남은 날짜와 문제에서 제시하는 L을 비교해야 한다.
예를들어 L = 1이고 P = 10, V=15라고 해보자. 극단적으로 L을 줄였다.
V/P = 1이고, 남는 일수는 5일이다.
L이 1인데 남는 일수 5일 전부 사용이 가능할까??? 아니다.
위에서 사용한 조건 중 20일이 확보되지 않으면 10일 사용못한다는 내용이 있다.
이 경우에 대입해 보면 1일을 사용하기 위해서 10일이 확보되어야 한다.
남은 일수가 5일인데 이는 P보다 작다. 따라서 위 경우의 답은 (15/10)*1+1이다.
즉 남은 일수를 모두 사용하는 것이 아니라 남은일수&L 중 작은 수 만큼 사용이 가능하다.
풀이 코드
package baekjun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _4796 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int caseNumber = 1;
while(true){
String s = br.readLine();
if (s.equals("0 0 0")) break;
String[] caseString = s.split(" ");
int[] each = new int[3];
for (int i=0; i<3; i++){
each[i] = Integer.parseInt(caseString[i]);
}
int answer = (each[2] / each[1])*each[0] + Math.min(each[0], each[2]%each[1]);
System.out.println("Case "+caseNumber+": "+answer);
caseNumber++;
}
}
}
'코테준비' 카테고리의 다른 글
[백준] Greedy: 기타줄 (0) | 2022.05.30 |
---|---|
[백준]Greedy: 보석도둑 (0) | 2022.05.29 |
[백준] Greedy: A → B (0) | 2022.05.28 |
[백준] Greedy: 뒤집기 (0) | 2022.05.28 |
[백준] Greedy: 단어수학 (0) | 2022.05.27 |