일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Gem
- SWEA
- linux
- spotify
- Spring
- C++
- Spring JPA
- spring boot
- Computer Science
- 백준
- java
- MYSQL
- 프로그래머스
- c
- 회귀
- SW Expert Academy
- SECS-II
- modern c++
- 자바
- programmers
- CS
- python
- Spotify Api
- Baekjoon
- 파이썬
- SECS
- 회원가입
- 스포티파이
- regression
- Today
- Total
비버놀로지
[SWEA SW Expert Academy] 1952. [모의 SW 역량테스트] 수영장 (JAVA) 본문
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq
김 프로는 수영장을 이용한다.
김 프로는 지출이 너무 많아 내년 1년 동안 각 달의 이용 계획을 수립하고 가장 적은 비용으로 수영장을 이용할 수 있는 방법을 찾고 있다.
수영장에서 판매하고 있는 이용권은 아래와 같이 4 종류이다.
① 1일 이용권 : 1일 이용이 가능하다.
② 1달 이용권 : 1달 동안 이용이 가능하다. 1달 이용권은 매달 1일부터 시작한다.
③ 3달 이용권 : 연속된 3달 동안 이용이 가능하다. 3달 이용권은 매달 1일부터 시작한다.
(11월, 12월에도 3달 이용권을 사용할 수 있다 / 다음 해의 이용권만을 구매할 수 있기 때문에 3달 이용권은 11월, 12월, 1윌 이나 12월, 1월, 2월 동안 사용하도록 구매할 수는 없다.)
④ 1년 이용권 : 1년 동안 이용이 가능하다. 1년 이용권은 매년 1월 1일부터 시작한다.
각 달의 이용 계획은 [Table 1]의 형태로 수립된다.
이용 계획에 나타나는 숫자는 해당 달에 수영장을 이용할 날의 수를 의미한다.
각 이용권의 요금과 각 달의 이용 계획이 입력으로 주어질 때,
가장 적은 비용으로 수영장을 이용할 수 있는 방법을 찾고 그 비용을 정답으로 출력하는 프로그램을 작성하라.
이 문제를 해결하기 위해서 DP(다이나믹 프로그래밍)으로 문제를 해결했습니다.
각 각의 월이 지나갈 때 마다 가장 최소가 되는 값을 찾아서 그 달에 가격에 넣어주는 방식입니다.
한달이 지났을때 어떤 표를 사야 저렴한지 비교를 진행하게 됩니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
for (int t = 1; t <= T; t++) {
int price[] = new int[4];
int month[] = new int[13];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < 4; i++) {
price[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i < month.length; i++) {
month[i] = Integer.parseInt(st.nextToken());
}
int monthlyPrice[] = new int[13];
for (int i = 1; i < monthlyPrice.length; i++) {
int dayPrice = price[0] * month[i] + monthlyPrice[i - 1]; //하루권
int monthPrice = price[1] + monthlyPrice[i - 1]; //한달권
int threeMonthPrice = Integer.MAX_VALUE; //3개월권
int yearPrice = Integer.MAX_VALUE; //1년권
if (i >= 3) { //3월부터는 3개월권 구매가능
threeMonthPrice = price[2] + monthlyPrice[i - 3];
}
if (i == 12) { //1년권을 살 수 있음
yearPrice = price[3];
}
monthlyPrice[i] = Math.min(dayPrice, Math.min(monthPrice, Math.min(threeMonthPrice, yearPrice)));
}
System.out.println("#" + t + " " + monthlyPrice[12]);
}
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[SWEA SW Expert Academy] 6019. 기차 사이의 파리 (JAVA) (0) | 2021.08.06 |
---|---|
[SWEA SW Expert Academy] 1953. [모의 SW 역량테스트] 탈주범 검거 (JAVA) (0) | 2021.07.23 |
[SWEA SW Expert Academy] 1949. [모의 SW 역량테스트] 등산로 조성 (JAVA) (0) | 2021.07.23 |
[Programmers 프로그래머스] 17683 [3차] 방금그곡 (JAVA) (0) | 2021.07.12 |
[Programmers 프로그래머스] 17687 n진수 게임 (JAVA) (0) | 2021.07.05 |