2023 Kakao Blind - 미로 탈출 명령어
Level: 3
Language: Java
Comment: dfs, bfs, 시뮬, 백트래킹
URL: https://programmers.co.kr/learn/courses/30/lessons/150365
전체 코드: https://github.com/juhwanHeo/algorithm/blob/main/src/main/java/com/programmers/kakao2023/blind/Test6.java
테스트 코드: https://github.com/juhwanHeo/algorithm/blob/main/src/test/java/com/programmers/kakao2023/blind/Test6Test.java
static String[] dirsStr = {"d" , "l", "r", "u"};
static int[][] dirs = {{1, 0}, {0, -1}, {0, 1}, {-1, 0}};
if (result != null) return; // (1)
if (depth + distance(row, col, endRow, endCol) > limit) return; // (2)
if (limit == depth) { // (3)
if (row == endRow && col == endCol) result = answer.toString();
return;
}
for (int i = 0; i < dirs.length; i++) {
int nRow = row + dirs[i][0];
int nCol = col + dirs[i][1];
if (nRow > 0 && nCol > 0 && nRow <= mapRow && nCol <= mapCol) {
answer.append(dirsStr[i]);
dfs(nRow, nCol, depth + 1, limit);
answer.delete(depth, depth + 1);
}
}
k - (시작 ~ 끝의 최단거리)
한 것이 짝수인 경우
일 때만k = 4
, 시작 = (1,3), 끝 = (3, 4) 로 주어지면(홀수)
k = 5
, 시작 = (1,3), 끝 = (3, 4) 로 주어지면 (짝수)
k - (시작 ~ 끝의 최소거리)
가 홀수 이면 impossible 을 return 하여 통과함// TC 31
int distance = distance(x, y, endRow, endCol);
if (distance > k || (k - distance) % 2 == 1) return "impossible";
dfs(x, y, 0, k);
/*
* @2023 KAKAO BLIND RECRUITMENT
* @TestName: 미로 탈출 명령어
* @URL: https://programmers.co.kr/learn/courses/30/lessons/150365
*/
public class Test6 {
static String[] dirsStr = {"d" , "l", "r", "u"};
static int[][] dirs = {{1, 0}, {0, -1}, {0, 1}, {-1, 0}};
static StringBuilder answer;
static String result;
static int endRow, endCol, mapRow, mapCol;
public static String solution(int n, int m, int x, int y, int r, int c, int k) {
result = null;
answer = new StringBuilder();
mapRow = n;
mapCol = m;
endRow = r;
endCol = c;
// x, y : start
// r, c : end
// TC 31
int distance = distance(x, y, endRow, endCol);
if (distance > k || (k - distance) % 2 == 1) return "impossible";
dfs(x, y, 0, k);
return result != null ? result : "impossible";
}
static int distance(int x, int y, int r, int c) {
return Math.abs(x - r) + Math.abs(y - c);
}
static void dfs(int row, int col, int depth, int limit) {
if (result != null) return;
if (depth + distance(row, col, endRow, endCol) > limit) return;
if (limit == depth) {
if (row == endRow && col == endCol) result = answer.toString();
return;
}
for (int i = 0; i < dirs.length; i++) {
int nRow = row + dirs[i][0];
int nCol = col + dirs[i][1];
if (nRow > 0 && nCol > 0 && nRow <= mapRow && nCol <= mapCol) {
answer.append(dirsStr[i]);
dfs(nRow, nCol, depth + 1, limit);
answer.delete(depth, depth + 1);
}
}
}
}
1차 코테를 볼때는 최적화를 생각못하고, 완탐을 때려버렸더니 반이상이 시간초과 나버렸다. 문제가 뜨고 다시 천천히 풀어보니 dfs 종료 조건이나,
k - (시작 ~ 끝의 최단거리)
한 것이짝수인 경우
를 생각해 해결하였다.
다른 분들이 올린 O(1) 만에 해결해 버리는 코드를 봤는데 대단했다...