Skip to content

Commit 8b58676

Browse files
committed
💡 프로그래머스 150365 - 미로 탈출 명령어
1 parent f4cb08e commit 8b58676

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
⭐️ 문제 정보 ⭐️
3+
문제 : 150365 - 미로 탈출 명령어
4+
레벨 : Level 3
5+
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/150365
6+
*/
7+
8+
function solution(n, m, x, y, r, c, k) {
9+
let answer = "impossible";
10+
const S = [x, y];
11+
const E = [r, c];
12+
const dir = [
13+
[1, 0, "d"],
14+
[0, -1, "l"],
15+
[0, 1, "r"],
16+
[-1, 0, "u"],
17+
];
18+
19+
function dfs(pos, path) {
20+
if (answer !== "impossible") {
21+
return;
22+
}
23+
24+
// 도착한 경우
25+
if (pos[0] === E[0] && pos[1] === E[1]) {
26+
if (path.length === k) {
27+
// 도착하기까지의 경로가 k와 같다면 이것이 답!
28+
answer = path;
29+
return;
30+
}
31+
}
32+
33+
// 남은 거리를 이용해서 시간 단축하기 (몰랐어;)
34+
const remaining = k - path.length; // k까지 남은 거리
35+
const minDist = Math.abs(pos[0] - E[0]) + Math.abs(pos[1] - E[1]);
36+
// case 1. 현 위치부터 목적지까지 최단 거리보다 남은 거리가 더 작다면 목적지까지 도달할 수 없다.
37+
if (minDist > remaining) {
38+
return;
39+
}
40+
// case 2. 남은 거리가 양수일 때 그 남은 거리가 짝수가 아니면 답이 아니다. (왔다갔다로 남은 거리를 소비할 수 없음)
41+
// 도착 지점에 도달했을 때 "k보다 일찍 도착했다!" → "남은 거리가 짝수가 아니군" 을 검사하기엔 늦다 (시간 초과 발생함)
42+
// 도착 지점까지의 최단거리보다 남은 거리가 더 길기 때문에, 잉여 거리를 예측하고, 그 잉여 거리가 짝수인지를 확인한다.
43+
// 좀 더 가지를 칠 수 있다. (이걸 어떻게 생각해내는것임;)
44+
if ((remaining - minDist) % 2 !== 0) {
45+
return;
46+
}
47+
48+
for (const [dx, dy, dirName] of dir) {
49+
const nx = pos[0] + dx;
50+
const ny = pos[1] + dy;
51+
52+
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m) {
53+
dfs([nx, ny], path + dirName);
54+
if (answer !== "impossible") {
55+
return;
56+
}
57+
}
58+
}
59+
}
60+
61+
dfs(S, "");
62+
63+
return answer;
64+
}

Programmers/README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
| --------- | --------- | --------- | --------- |
1111
| 1845 | 폰켓몬 | [1845_폰켓몬.js](Level1/1845_폰켓몬.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/1845) |
1212
| 12906 | 같은 숫자는 싫어 | [12906_같은_숫자는_싫어.js](Level1/12906_같은_숫자는_싫어.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12906) |
13-
| 12909 | 올바른 괄호 | [12909_올바른_괄호.js](Level2/12909_올바른_괄호.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12909) |
13+
| 12909 | 올바른 괄호 | [12909_올바른_괄호.js](Level2/12909_올바른_괄호.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12909) |
1414
| 12910 | 나누어 떨어지는 숫자 배열 | [12910_나누어_떨어지는_숫자_배열.js](Level1/12910_나누어_떨어지는_숫자_배열.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12910) |
1515
| 12924 | 숫자의 표현 | [12924_숫자의_표현.js](Level2/12924_숫자의_표현.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12924) |
1616
| 12939 | 최댓값과 최솟값 | [12939_최댓값과_최솟값.js](Level2/12939_최댓값과_최솟값.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12939) |
@@ -32,13 +32,13 @@
3232
| 42584 | 주식가격 | [42584_주식가격.js](Level2/42584_주식가격.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42584) |
3333
| 42586 | 기능개발 | [42586_기능개발.js](Level2/42586_기능개발.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42586) |
3434
| 42840 | 모의고사 | [42840_모의고사.js](Level1/42840_모의고사.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42840) |
35-
| 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) |
35+
| 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) |
3636
| 42889 | 실패율 | [42889_실패율.js](Level1/42889_실패율.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42889) |
3737
| 49993 | 스킬트리 | [49993_스킬트리.js](Level2/49993_스킬트리.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49993) |
3838
| 49994 | 방문 길이 | [49994_방문_길이.js](Level2/49994_방문_길이.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49994) |
3939
| 60057 | 문자열 압축 | [60057_문자열_압축.js](Level2/60057_문자열_압축.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60057) |
4040
| 60062 | 외벽 점검 | [60062_외벽_점검.js](60062_외벽_점검.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60062) |
41-
| 64061 | 크레인 인형뽑기 게임 | [64061_크레인_인형뽑기_게임.js](Level1/64061_크레인_인형뽑기_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64061) |
41+
| 64061 | 크레인 인형뽑기 게임 | [64061_크레인_인형뽑기_게임.js](Level1/64061_크레인_인형뽑기_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64061) |
4242
| 64062 | 징검다리 건너기 | [64062_징검다리_건너기.js](Level3/64062_징검다리_건너기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64062) |
4343
| 64064 | 불량 사용자 | [64064_불량_사용자.js](Level3/64064_불량_사용자.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64064) |
4444
| 64065 | 튜플 | [64065_튜플.js](Level2/64065_튜플.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64065) |
@@ -55,8 +55,8 @@
5555
| 77486 | 다단계 칫솔 판매 | [77486_다단계_칫솔_판매.js](Level3/77486_다단계_칫솔_판매.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77486) |
5656
| 77885 | 2개 이하로 다른 비트 | [77885_2개_이하로_다른_비트.js](Level2/77885_2개_이하로_다른_비트.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77885) |
5757
| 81303 | 표 편집 | [81303_표_편집.js](Level3/81303_표_편집.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/81303) |
58-
| 87390 | n^2 배열 자르기 | [87390_n^2_배열_자르기.js](Level2/87390_n^2_배열_자르기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/87390) |
59-
| 92334 | 신고 결과 받기 | [92334_신고_결과_받기.js](Level1/92334_신고_결과_받기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92334) |
58+
| 87390 | n^2 배열 자르기 | [87390_n^2_배열_자르기.js](Level2/87390_n^2_배열_자르기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/87390) |
59+
| 92334 | 신고 결과 받기 | [92334_신고_결과_받기.js](Level1/92334_신고_결과_받기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92334) |
6060
| 92341 | 주차 요금 계산 | [92341_주차_요금_계산.js](Level2/92341_주차_요금_계산.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92341) |
6161
| 118666 | 성격 유형 검사하기 | [118666_성격_유형_검사하기.js](Level1/118666_성격_유형_검사하기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/118666) |
6262
| 118667 | 두 큐 합 같게 만들기 | [118667_두_큐_합_같게_만들기.js](Level2/118667_두_큐_합_같게_만들기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/118667) |
@@ -67,6 +67,7 @@
6767
| 121683 | 외톨이 알파벳.cpp | [121683_외톨이_알파벳.cpp](Unrated/121683_외톨이_알파벳.cpp) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
6868
| 121683 | 외톨이 알파벳 | [121683_외톨이_알파벳.js](Unrated/121683_외톨이_알파벳.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
6969
| 131127 | 할인 행사 | [131127_할인_행사.js](Level2/131127_할인_행사.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/131127) |
70+
| 150365 | 미로 탈출 명령어 | [150365_미로_탈출_명령어.js](Level3/150365_미로_탈출_명령어.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/150365) |
7071
| 150370 | 개인정보 수집 유효기간 | [150370_개인정보_수집_유효기간.js](Level1/150370_개인정보_수집_유효기간.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/150370) |
7172
| 159993 | 미로 탈출 | [159993_미로_탈출.js](Level2/159993_미로_탈출.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/159993) |
7273
| 159994 | 카드 뭉치 | [159994_카드_뭉치.js](Level1/159994_카드_뭉치.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/159994) |

0 commit comments

Comments
 (0)