> 문제
문제 : [경주로 건설]
> 문제풀이
최소 경로값 찾는 문제이다.
dfs, bfs 모두 풀이가 가능하지만, 메모이제이션을 이용해서 풀어야 한다.
나는 dfs로 풀었으며 가지치기해서 시간을 줄였다.
class Solution {
static boolean check(int x, int y, int[][] map){
if(x>=0 && y>=0 && x<map.length && y<map[x].length) return true;
else return false;
}
static int[][] dir = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
static int M;
static int[][] memo;
static public int solution(int[][] board) {
M = board.length;
memo = new int[M][M];
boolean[][] visit = new boolean[M][M];
for(int i=0; i<M; i++){
for(int j=0; j<M; j++) memo[i][j] = Integer.MAX_VALUE;
}
visit[0][0] = true;
dfs(0,0,-1,0,board,visit);
return res;
}
static int res = Integer.MAX_VALUE;
static void dfs(int x, int y, int direction, int val, int[][] board, boolean[][] visit) {
if(x == M-1 && y == M-1) {
if(res > val) res = val;
return;
}
if(res < val) return;
if(memo[x][y] < val) return;
int dx, dy;
for(int d=0; d<4; d++){
dx = x + dir[d][0];
dy = y + dir[d][1];
if(check(dx,dy,board) && board[dx][dy] == 0 && !visit[dx][dy]){
visit[dx][dy] = true;
if(d==direction || direction == -1){
if(memo[dx][dy] >= val + 100){
memo[dx][dy] = val+100;
dfs(dx,dy,d,val+100,board,visit);
}
}else {
if(memo[dx][dy] >= val + 600){
memo[dx][dy] = val+600;
dfs(dx,dy,d,val+600,board,visit);
}
}
visit[dx][dy] = false;
}
}
}
}
문제 출처 : Programmers
PREVIOUS[백준] 2186번, 문자판