알고리즘/dp
[SWEA] Test샘플문제 - 1952번 수영장 문제 (dp풀이)
Fenderblue
2023. 5. 5. 02:57
dp로도 풀어봤다
사실 dp로 처음에 어케 푼다는거지..?바로 감이 오진 않았다
손으로 하나하나 풀어보면서 겨우 감을 잡고 코드를 짰다..
눈물..
나는 먼저 일일권 vs 한달권중 더 이득인걸 plan 배열에 각 달마다 넣었고
그다음 dp를 진행하며 3달권이 더 이득인지 아닌지를 판별하도록 했다
연간권이 더 이득인지는 마찬가지로 맨 마지막에 한번 비교하도록 했다
풀이코드
package SWTest;
import java.io.*;
import java.util.StringTokenizer;
public class SW_1952_DP { //dp로 다시 풀이해보기
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
int[] charges;
int[] plan;
int[] dp;
int temp;
int minCharge = Integer.MAX_VALUE;
int tempCharge;
for (int t = 1; t <= T; t++) {
st = new StringTokenizer(br.readLine());
charges = new int[4];
plan = new int[13];
dp = new int[13];
for (int i = 0; i < 4; i++) {
charges[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= 12; i++) {
plan[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= 12; i++) {
if (plan[i] * charges[0] < charges[1]) { //일일권 구매하는게 한달권보다 이득이면 일일권 구매가격으로 값 새로저장
plan[i] = plan[i] * charges[0];
} else { //그 반대가 이득이면 한달권 구매가격으로 값 새로저장
plan[i] = charges[1];
}
} //여기까지 하면 일일권vs한달권 더 이득인게 plan에 저장된상태
for (int i = 1; i <= 12; i++) {
//dp배열에 i 바로직전의 dp값+현재의 dp값을 더한것과 i번째달에서 두달 전까지 3달요금과 그 이전(-3번쨰달)달의 dp값을 더한것중 더 작은걸 dp에 저장
if (i == 1) { //1월을 검사할떄는 그냥 plan에 들어있는값과 3달가를 비교한다
dp[i] = Integer.min(plan[i], charges[3]);
} else if (i == 2) { //2월을 검사할떄는 이전달 dp값+현재 plan값과 3달가를 비교한다
dp[i] = Integer.min(dp[i - 1] + plan[i], charges[2]);
} else {
dp[i] = Integer.min((dp[i - 1] + plan[i]), dp[i - 3] + charges[2]);
}
}
if (charges[3] > dp[12]) {
bw.write("#" + t + " " + dp[12]);
} else {
bw.write("#" + t + " " + charges[3]);
}
bw.newLine();
}
bw.flush();
bw.close();
}
}