일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- SECS/GEM
- Spring
- python
- 회원가입
- 프로그래머스
- CS
- spring boot
- Spring JPA
- regression
- java
- 백준
- C++
- 회귀
- Spotify Api
- MYSQL
- c
- 파이썬
- linux
- Baekjoon
- spotify
- SW Expert Academy
- SECS
- SECS-II
- programmers
- modern c++
- 스포티파이
- Computer Science
- SWEA
- Gem
- Today
- Total
비버놀로지
[BAEKJOON 백준] 13302 리조트 (JAVA) 본문
https://www.acmicpc.net/problem/13302
문제
수영이는 여름방학을 맞이하여 많은 놀이 시설이 있는 KOI 리조트에 놀러가려고 한다. 리조트의 하루 이용권의 가격은 만원이다. 하지만 리조트의 규모는 상상을 초월하여 모든 시설을 충분히 즐기기 위해서는 하루로는 터무니없이 부족하다. 그래서 많은 이용객들은 3일 이상 연속으로 이용하기도 한다. KOI 리조트에서는 3일 연속 이용권을 할인된 가격 이만오천원에, 연속 5일권은 삼만칠천원에 판매하고 있다. 게다가 연속 3일권, 연속 5일권에는 쿠폰이 각각 1장, 2장이 함께 포함되어 있다. 쿠폰 3장은 하루 이용권 한 장으로 교환할 수 있다.
이용권 종류 | 가격 | 쿠폰지급 |
하루 이용권 | 10,000원 | 없음 |
연속 3일권 | 25,000원 | 쿠폰 1장 |
연속 5일권 | 37,000원 | 쿠폰 2장 |
연속 3일권과 연속 5일권은 구입일로부터 연속으로 3일 혹은 5일간만 이용이 가능하지만 해당 기간을 모두 이용할 필요는 없다.
수영이는 N일의 여름방학 중 다른 일정으로 리조트에 갈 수 없는 날이 M일 있다. KOI 리조트를 사랑하는 수영이는 그 외의 모든 날을 KOI 리조트에서 보내고자 한다. 물론, 가장 저렴한 비용으로 리조트를 이용하고자 한다.
예를 들어, 여름방학이 13일이라고 하고, 여름방학 기간 중 리조트에 갈 수 없는 날이 4번째, 6번째, 7번째, 11번째, 12번째 날이라고 하자. 다음 표의 첫 번째 행은 13일의 여름방학을 나타내고, 리조트에 갈 수 없는 날은 검정색으로 표시되어 있다. 표의 두 번째 행과 세 번째 행은 수영이가 이용권을 구입하는 두 가지 방법을 나타낸다.
두 번째 행의 구입 방법은 다음과 같다. 여름방학의 첫 번째 날에 연속 3일권을 구입하여 3번째 날까지 리조트를 이용하고, 구매시 1장의 쿠폰을 받는다. 5번째 날에는 하루 이용권을 구입하여 이용한다. 8번째 날에는 연속 3일권을 구입하여 10번째 날까지 리조트를 이용하고, 역시 구매시 쿠폰 1장을 받는다. 13번째 날에는 하루 이용권을 구입하여 리조트를 이용한다. 이렇게 하여 수영이가 리조트 이용을 위해 지불한 전체 비용은 70,000원이다.
세 번째 행은 더 저렴한 비용으로 리조트를 이용하는 구입 방법이다. 여름방학의 첫 번째 날에 연속 5일권을 구입하여 5번째 날까지 리조트를 이용하고(4번째 날 제외), 구매시 2장의 쿠폰을 받는다. 그리고 8번째 날에 연속 3일권을 구입하여 10번째 날까지 리조트를 이용하고, 역시 구매시 쿠폰 1장을 받는다. 13번째 날에는 그때까지 받은 3장의 쿠폰을 하루 이용권 한 장으로 교환하여 리조트를 이용한다. 이렇게 하여 수영이가 리조트 이용을 위해 지불한 전체 비용은 62,000원이다.
여름방학 기간과 리조트에 갈 수 없는 날의 정보가 주어질 때, 리조트를 이용하기 위해서 수영이가 지불해야 하는 최소비용을 계산하는 프로그램을 작성하시오.
입력
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 수영이의 여름방학의 일수를 뜻하는 정수 N(1 ≤ N ≤ 100)과 수영이가 리조트에 갈 수 없는 날의 수 M (0 ≤ M ≤ N)이 순서대로 주어진다. M이 0인 경우 더 이상의 입력은 주어지지 않으며, M이 0보다 큰 경우 그 다음 줄에는 수영이가 리조트에 갈 수 없는 날이 1 이상 N 이하의 정수로 날짜 순서대로 M개 주어진다.
예를 들어, M이 3이고 입력의 두 번째 줄에 정수 “12 14 17”이 주어진다면 여름방학의 12번째, 14번째, 17번째 날에는 리조트에 갈 수 없음을 의미한다.
출력
표준 출력으로 주어진 입력에서 제시된 날들을 제외한 나머지 날 모두 리조트에 입장하기 위해서 지불해야 하는 비용의 최솟값을 출력한다.
서브태스크
1 | 11 | N ≤ 5 |
2 | 17 | M = 0 |
3 | 72 | 원래의 제약조건 이외에 아무 제약조건이 없다. |
예제 입력 1 복사
13 5
4 6 7 11 12
예제 출력 1 복사
62000
예제 입력 2 복사
50 10
3 5 7 11 15 16 22 23 24 34
예제 출력 2 복사
288000
DFS를 활용을 해서 DP를 넣어준다.
하루하루 지나가면서 dp를 변경해 준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int dp[][], N, M;
private static boolean map[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new boolean[N + 1];
if (M > 0) {
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
map[Integer.parseInt(st.nextToken())] = true;
}
}
dp = new int[N + 1][N + 1];
for (int i = 0; i < N + 1; i++) {
Arrays.fill(dp[i], -1);
}
System.out.println(solve(1, 0));
}
static int solve(int day, int coupon) {
if (day > N)
return 0;
if (dp[day][coupon] != -1)
return dp[day][coupon];
dp[day][coupon] = Integer.MAX_VALUE;
if (map[day]) {
return dp[day][coupon] = Math.min(dp[day][coupon], solve(day + 1, coupon));
} else {
if (coupon >= 3) {
dp[day][coupon] = Math.min(dp[day][coupon], solve(day + 1, coupon - 3));
}
dp[day][coupon] = Math.min(dp[day][coupon], solve(day + 1, coupon) + 10000);
dp[day][coupon] = Math.min(dp[day][coupon], solve(day + 3, coupon + 1) + 25000);
dp[day][coupon] = Math.min(dp[day][coupon], solve(day + 5, coupon + 2) + 37000);
}
return dp[day][coupon];
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 14462 소가 길을 건너간 이유 8 (JAVA) (0) | 2022.05.14 |
---|---|
[BAEKJOON 백준] 5875 오타 (JAVA) (0) | 2022.05.12 |
[BAEKJOON 백준] 16507 어두운 건 무서워 (JAVA) (0) | 2022.05.08 |
[BAEKJOON 백준] 17425 약수의 합 (JAVA) (0) | 2022.05.08 |
[SOFTEER 소프티어] 623 비밀메뉴 (JAVA) (0) | 2022.05.05 |