공부기록

경주로 건설 본문

코테/프로그래머스

경주로 건설

코타쿠 2021. 5. 4. 12:16
  • 문제

https://programmers.co.kr/learn/courses/30/lessons/67259

 

코딩테스트 연습 - 경주로 건설

[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[

programmers.co.kr

  • 코드
더보기
import java.util.*;

class Solution {
    
    class Pair{
        int row;
        int col;
        int prevDir;
        int curVal;
        public Pair(int row, int col, int prevDir, int curVal){
            this.row = row;
            this.col = col;
            this.prevDir = prevDir;
            this.curVal = curVal;
        }
    }
    
    private final int mv[][] = {
        {-1,0},
        {0,1},
        {1,0},
        {0,-1}
    };
    
    private void printArr(int[][] prev){
        int N = prev.length;
        System.out.println();
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                System.out.print(prev[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }

    private void bfs(int[][] board, int[][] his){
        int N = board.length;
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(0,0,-1,0));
        his[0][0] = 0;
        while(q.size() != 0){
            Pair curNode = q.poll();
            int c_r = curNode.row;
            int c_c = curNode.col;
            int prev_dir = curNode.prevDir;
            int c_v = curNode.curVal;
            for(int i=0; i<4; i++){
                int n_r = c_r + this.mv[i][0];
                int n_c = c_c + this.mv[i][1];
                int n_v = c_v;
                if(prev_dir != -1 && prev_dir != i)
                    n_v += 600;
                else
                    n_v += 100;
                if(N <= n_r || n_r < 0 || N <= n_c || n_c < 0)
                    continue;
                else if(board[n_r][n_c] == 1)
                    continue;
                else if(his[n_r][n_c] < n_v)
                    continue;
                q.add(new Pair(n_r,n_c,i,n_v));
                his[n_r][n_c] = n_v;
            }
        }
    }
    
    public int solution(int[][] board) {
        int answer = 0;
        int N = board.length;
        int prev[][] = new int[N][N];
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                prev[i][j] = 2000000000;
            }
        }
        
        this.bfs(board, prev);
        // this.printArr(prev);
        
        answer = prev[N-1][N-1];
        
        return answer;
    }
}
  • 피드백
    • 1시간 20분 걸림
    • 처음에 dfs로 했다가  실패 총 625칸
    • 다음에 dp로 하려고 했으나 설계가 안됨
    • 그 후 bfs로 했으나 실패
    • 최단거리가 아닌 코너 + 직선 값으로 인한 총 비용 값으로 his를 구성했어야함
    • his를 비용의 최솟값으로 하니 통과 

'코테 > 프로그래머스' 카테고리의 다른 글

후보키  (0) 2021.05.05
임시  (0) 2021.05.05
괄호변환  (1) 2021.05.03
보석 쇼핑  (0) 2021.04.16
징검다리 건너기  (0) 2021.04.16