알고리즘/코드트리 문제풀이
코드트리 [자바 java] 적절한 옷 고르기
잔디🌿
2023. 8. 15. 18:04
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
이 문제는 다소 복잡해보이는 문제이지만, 막상 풀이를 생각해보면 크게 어렵지는 않다.
문제에서 입력으로 옷 수, 해당 옷들의 화려함, 시작일, 종료일이 주어진다. 이 옷들을 입는 경우들을 적절하게 조합해서 만족도의 최댓값을 구하는 문제이다 .
나는 dp를 이차원배열로 만들고, 해당 일에 해당 옷을 입는 경우 중 가능한 가장 큰 값을 dp에 저장하도록 하였다. 위의 경우를 dp에 넣는다고 가정해보자.
옷/일수 | 1 | 2 | 3 | 4 | 5 |
1 | 0 A | D | |||
2 | 0 B | ||||
3 | 0 C |
1일차는 전날이 없으므로 dp값이 전부 0이다.
D의 값을 구해보고자 하면, A,B,C중에서 1번 옷과 해당 번호의 차이 + 해당 DP값 중 가장 큰 값을 넣으면 된다.
이 때 주의할 점은 1일차에 1,2,3,번 옷을 사용 가능한지 여부와 2일차에 1번 옷을 사용할 수 있는지 여부이다. 만약 사용이 불가하다면 -1을 넣고 다음 배열을 탐색하도록 하였다.
이를 끝까지 하면 5일차에 123번 옷 dp값이 모두 찬다. 여기서 답은 123번 옷의 dp값 중 최댓값을 구하면 된다.
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); //옷 개수
int m = Integer.parseInt(st.nextToken()); //일수
// st = new StringTokenizer(br.readLine());
int[] start = new int[n]; //옷 별 시작일
int[] fin = new int[n];//옷 별 끝일
int[] w = new int[n];//옷 별 화려함
for(int i = 0;i<n;i++){
st = new StringTokenizer(br.readLine());
start[i] = Integer.parseInt(st.nextToken());
fin[i] = Integer.parseInt(st.nextToken());
w[i] = Integer.parseInt(st.nextToken());
}
int[][] dp = new int[n][m+1];
for(int i = 2;i<=m;i++){
for(int j = 0;j<n;j++){
if(i < start[j] || i > fin[j]) {
dp[j][i] = -1;
} //i일에 사용 x인 경우
else{
int d = 0;
for(int k = 0;k<n;k++){
if(i-1 < start[k] || i-1 > fin[k]) continue; // 전날 해당 옷이 사용 불가인 경우
d = Math.max(d,Math.abs(w[k] - w[j]) + dp[k][i-1]);
}
dp[j][i] = d;
}
}
}
int ans = 0;
for(int i = 0;i<n;i++){
ans = Math.max(ans,dp[i][m]);
}
System.out.println(ans);
}
}