[BOJ] 2342. Dance Dance Revolution (๐Ÿฅ‡, DP)

lemythe423ยท2024๋…„ 3์›” 11์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
125/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐœ์„ (์™ผ์ชฝ ๋ฐœ, ์˜ค๋ฅธ์ชฝ ๋ฐœ)์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์ขŒํ‘œ๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ ๋งค๋ฒˆ ๋ฐœ์„ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด์„œ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. ๋งค๋ฒˆ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ์ตœ์†Œ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””๊ฐ€ ์•„๋‹ˆ๋ผ DP๋กœ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐœ์ด ๋†“์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋Š” 0~5๋กœ ์ขŒํ‘œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด 5x5ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ด ๋œ๋‹ค. ๋ฐœ์„ ์˜ฎ๊ธฐ๋Š” ํšŸ์ˆ˜๋Š” N๋ฒˆ์ด๊ณ  ๋งค๋ฒˆ ๋ฐœ์„ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค 5x5์˜ 2์ฐจ์›์— ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ 10๋งŒx25 = 250๋งŒ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฒ˜์Œ ์‹œ์ž‘์€ (0, 0)์œผ๋กœ ์ฒซ๋ฒˆ์งธ๋กœ ๋ฐœ์„ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์นธ์€ x์นธ์ด๋‹ค. 0์—์„œ๋Š” ์–ด๋””๋กœ ์›€์ง์—ฌ๋„ 2๋งŒํผ์˜ ํž˜์„ ์–ป๊ฒŒ ๋˜๋ฏ€๋กœ (0, x)์™€ (x, 0)์— ๊ฐ๊ฐ ๊ฐ’2๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด๋†“๊ณ  ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

import java.util.*;
import java.io.*;

public class Main {
    static int getPower(int s, int e) {
        if (s == 0) return 2;
        if (s == e) return 1;

        if (s == 1) {
            if (e == 3) return 4;
            else return 3;
        } else if (s == 2) {
            if (e == 4) return 4;
            else return 3;
        } else if (s == 3) {
            if (e == 1) return 4;
            else return 3;
        } else {
            if (e == 2) return 4;
            else return 3;
        }
    }

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        List<Integer> arr = new ArrayList<>();
        int input;
        while (true) {
            input = sc.nextInt();
            if (input == 0) break;
            arr.add(input);
        }

        int N = arr.size();
        if (N == 0) System.out.println(0);
        if (N > 0) {
            int[][][] dp = new int[N][5][5];
    
            int next = arr.get(0);
            int left;
            int right;
            int score;
            dp[0][next][0] = 2;
            dp[0][0][next] = 2;
            for (int i = 0; i < N-1; i++) {
                next = arr.get(i+1);
                for (int j = 0; j < 5; j++) {
                    for (int k = 0; k < 5; k++) {
                        score = dp[i][j][k];
                        if (dp[i][j][k] == 0) continue;
                        
                        left = getPower(j, next);
                        right = getPower(k, next);
                        
                        if (dp[i+1][next][k] == 0) {
                            dp[i+1][next][k] = score + left;
                        } else {
                            dp[i+1][next][k] = Math.min(dp[i+1][next][k], score + left);
                        }
                        
                        if (dp[i+1][j][next] == 0) {
                            dp[i+1][j][next] = score + right;
                        } else {
                            dp[i+1][j][next] = Math.min(dp[i+1][j][next], score + right);
                        }
                    }
                }
            }
            int answer = Integer.MAX_VALUE;
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    if (dp[N-1][i][j] == 0) continue;
                    answer = Math.min(answer, dp[N-1][i][j]);
                }
            }
    
            System.out.println(answer);
        }
    }
}
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€