알고리즘/백준 문제 풀이

[BOJ] 2342. Dance Dance Revolution

바켱서 2020. 7. 14. 20:27

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

접근 방법

먼저 완전탐색을 이용해 재귀함수를 적용했다.

어차피 왼발, 오른발에 상태값은 0,1,2,3,4 로 고정되어있으니 무조건 재귀 함수를 불렀을 때 겹치는 결과가 나올 것이라 생각함. → 메모지에이션

현재있는 지점에서 어디로 갈 건지를 정하면서 left foot의 값에서 갈 지 right foot의 값에서 갈 지에 해당하는 힘을 추가해서 가장 최솟값을 구한다.

static int going(int go, int to){
        if(go==0) return 2;
        if(Math.abs(go-to) ==2) return 4;
        if(go==to) return 1;
        return 3;
    }

주의 사항

Need Know

  1. DP

전체 코드 ( Java )

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int[][][] dp;
    static ArrayList<Integer> map = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        set();
        solve();
        bw.flush();
        br.close();
        bw.close();
    }
    static void set() throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());
        while(true){
            int k = Integer.parseInt(st.nextToken());
            if(k==0) break;
            map.add(k);
        }
        dp = new int[map.size()][5][5];
    }
    static void solve() throws IOException {
        bw.write(dfs(0,0,0)+"");
    }
    static int dfs(int x, int left, int right){
        if(x==map.size()){
            return 0;
        }
        if(dp[x][left][right] != 0){
            return dp[x][left][right];
        }

        int goLeft = dfs(x+1,map.get(x),right) + going(left,map.get(x));
        int goRight = dfs(x+1,left,map.get(x)) + going(right,map.get(x));

        return dp[x][left][right] = Math.min(goLeft, goRight);
    }
    static int going(int go, int to){
        if(go==0) return 2;
        if(Math.abs(go-to) ==2) return 4;
        if(go==to) return 1;
        return 3;
    }
}