BOJ_2342_Dance Dance Revolution_java

2023. 2. 10. 19:05Algorithm/BOJ

728x90

https://www.acmicpc.net/problem/2342

 

2342번: Dance Dance Revolution

입력은 지시 사항으로 이루어진다. 각각의 지시 사항은 하나의 수열로 이루어진다. 각각의 수열은 1, 2, 3, 4의 숫자들로 이루어지고, 이 숫자들은 각각의 방향을 나타낸다. 그리고 0은 수열의 마

www.acmicpc.net

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

/**
 백준 2342번 Dance Dance Revolution
 골드 3
 */
public class BOJ_2342_DanceDanceRevolution {
    static final int INF = 987654321;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // input :
        //   1
        // 2 0 4
        //   3

        int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] input = new int[arr.length];
        input[0] = 0;
        for (int i = 0; i<arr.length-1; i++){ // 마지막 0 제거
            input[i+1] = arr[i];
        }
        solution(input);
    }

    public static void solution(int[] input){
        int inputLength = input.length;

        int[][][] dp = new int[inputLength][5][5]; // idx, left, right
        for (int i = 0; i<inputLength; i++){ // 초기화
            for (int j = 0; j<5; j++){
                for (int k = 0; k<5; k++){
                    dp[i][j][k] = INF;
                }
            }
        }

        dp[0][0][0] = 0;
        for (int idx = 0; idx < inputLength-1; idx++){
            int next = input[idx  + 1]; // 다음 ddr

            for (int i = 0; i<5; i++){ //left
                for (int j = 0; j<5; j++){ //right
                    int now = dp[idx][i][j]; // 현재 발판 정보

                    if (next != j){ // 해당 위치에 이미 발이 있는 경우 이동 불가
                        // 왼발 이동
                        dp[idx+1][next][j] = Math.min(dp[idx+1][next][j], now + moveCost(i, next));
                    }
                    if (next != i){ // 해당 위치에 이미 발이 있는 경우 이동 불가
                        // 오른발 이동
                        dp[idx+1][i][next] = Math.min(dp[idx+1][i][next], now + moveCost(j, next));
                    }
                }
            }
        }

        int ans = Integer.MAX_VALUE;
        for (int i = 0; i<5; i++){
            for (int j = 0; j<5; j++){
                ans = Math.min(ans, dp[inputLength-1][i][j]);
            }
        }
        System.out.println(ans);
    }

    public static int moveCost(int from, int to){
        if (from == to){
            return  1;
        }else if (from == 0){
            return 2;
        }else if(Math.abs(from - to) == 2 ){
            return 4;
        }
        return 3;
    }
}

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

BOJ_16724_피리 부는 사나이_java  (0) 2023.02.13
BOJ_9466_텀 프로젝트_java  (0) 2023.02.13
BOJ_7579_앱_java  (0) 2023.02.09
BOJ_4386_별자리 만들기_java  (0) 2023.02.08
BOJ_2473_세 용액_java  (0) 2023.02.07