1952번 : 수영장 [Java]

2021. 3. 15. 14:41Algorithm/SWEA

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

해결방안

DFS 혹은 DP로 풀 수 있는 문제였다. 코드가 더 간단한 것 같아 DP 선택.

 

1월은 (1월 이용계획 * 1일 이용권 가격)과 (1달 이용권 가격) 중 적은 비용을 선택

2월은 (1월까지의 가격 + 2월 이용계획 * 1일 이용권 가격)과 (1월까지의 가격 + 1달 이용권 가격) 중 적은 비용을 선택

3월~12월은 (전 달까지의 가격 + 해당 월 이용계획 * 1일 이용권 가격), (전 달 까지의 가격 + 1달 이용권 가격), (3달 전 까지의 가격 + 3달 이용권 가격) 중 적은 비용을 선택

 

단, 12월은 1년 이용권 가격과도 비교가 필요하다.

 

모든 dp배열을 채운 후 12월에 해당하는 값이 답.

 

 

 

전체 코드

import java.util.Scanner;

public class Solution {
	static int[] price;
	static int[] plan;
    
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int tc = 1; tc <= T; tc++) {
			price = new int[4];
			plan = new int[13];

			for (int i = 0; i < 4; i++)
				price[i] = sc.nextInt();
			for (int i = 1; i < 13; i++)
				plan[i] = sc.nextInt();

			int[] dp = new int[13];

			dp[0] = 0;
			dp[1] = Math.min(plan[1] * price[0], price[1]);
			dp[2] = Math.min(dp[1] + plan[2] * price[0], dp[1] + price[1]);

			for (int i = 3; i <= 12; i++) {
				dp[i] = Math.min(dp[i - 1] + plan[i] * price[0], Math.min(dp[i - 1] + price[1], dp[i - 3] + price[2]));
				if (i == 12) {
					dp[i] = Math.min(dp[i], price[3]);
				}
			}

			System.out.println("#" + tc + " " + dp[12]);
		}
	}
}
반응형

'Algorithm > SWEA' 카테고리의 다른 글

2112번 : 보호 필름 [Java]  (0) 2021.04.23
1267번 : 작업순서 [Java]  (0) 2021.04.23
5215번 : 햄버거 다이어트 [Java]  (0) 2021.03.16
1949번 : 등산로 조성 [Java]  (0) 2021.03.14