728x90

🔗 백준 2342 Dance Dance Revolution 

📌오늘의 학습 키워드

  • DP 문제

✨공부한 내용 본인의 언어로 정리하기

  • 3차원 배열에 DP를 저장해야했다.
  • 전체적인 논리는 각 단계의 이전까지의 정보를 가지고 현재 값을 업데이트하여 계속 총 비용을 계산해 나가는 것이다.

 

📚오늘의 회고

  • DP에서 무엇을 저장하고 어떻게 작은 문제로 나눌 것인 지 생각하는 게 쉽지 않다...

[🤓문제 해결 코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int[] arr;
	static int[][][] dp;
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		arr = new int[100001];
		
		int num, idx=0;
		while(true) {
			num = Integer.parseInt(st.nextToken());
			if(num == 0)
				break;
			arr[++idx] = num;
		}
		
		dp = new int[2][5][5];
		
		// 0 이전, 1 현재
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				dp[0][i][j] = Integer.MAX_VALUE;
				dp[1][i][j] = Integer.MAX_VALUE;
			}
		}
		
		dp[0][0][0] = 0;
		int next = 0;
		
		// 들어온 숫자를 순회
		for(int k=1; k<=idx; k++) {
			next = arr[k];
			for(int i=0; i<5; i++) {
				for(int j=0; j<5; j++) {
					// 불가능한 상황이면 패스
					if(dp[0][i][j] == Integer.MAX_VALUE)
						continue;
					
					dp[1][i][next] = Math.min(dp[1][i][next], dp[0][i][j] + cost(j, next));
					dp[1][next][j] = Math.min(dp[1][next][j], dp[0][i][j] + cost(i, next));
				}
			}
			
			// 값 복사하고 현재값 초기화
			for(int i=0; i<5; i++) {
				for(int j=0; j<5; j++) {
					dp[0][i][j] = dp[1][i][j];
					dp[1][i][j] = Integer.MAX_VALUE;
				}
			}
			
			for(int i=0; i<5; i++) {
				for(int j=0; j<5; j++) {
					System.out.printf("%d ", dp[0][i][j]);
				}
				System.out.println();
			}
			System.out.println();
		}
		
		// 마지막까지 왔을 때의 최적값들만 업데이트 되어있음
		int ans = Integer.MAX_VALUE;
		for(int i=0; i<5; i++) {
			ans = Math.min(ans, dp[0][i][next]);
			ans = Math.min(ans, dp[0][next][i]);
		}
		
		System.out.println(ans);
	}
	
	static int cost(int a, int b) {
		if(a == b)
			return 1;
		
		if(a == 0 || b == 0) {
			return 2;
		}
		
		if(Math.abs(a-b)==2) {
			return 4;
		}
		
		return 3;
	}
}
728x90

'코딩테스트' 카테고리의 다른 글

백준 2842 집배원 한상덕  (0) 2025.02.20
백준 1719 택배 자바  (0) 2025.02.20
백준 17609 회문 자바  (0) 2025.02.19
백준 11404 플로이드  (0) 2025.02.18
삼성 SDS 2025년도 상반기 알고리즘 특강 기록  (0) 2025.02.18