Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions Programmers/Level3/150365_미로_탈출_명령어.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 150365 - 미로 탈출 명령어
레벨 : Level 3
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/150365
*/

function solution(n, m, x, y, r, c, k) {
let answer = "impossible";
const S = [x, y];
const E = [r, c];
const dir = [
[1, 0, "d"],
[0, -1, "l"],
[0, 1, "r"],
[-1, 0, "u"],
];

function dfs(pos, path) {
if (answer !== "impossible") {
return;
}

// 도착한 경우
if (pos[0] === E[0] && pos[1] === E[1]) {
if (path.length === k) {
// 도착하기까지의 경로가 k와 같다면 이것이 답!
answer = path;
return;
}
}

// 남은 거리를 이용해서 시간 단축하기 (몰랐어;)
const remaining = k - path.length; // k까지 남은 거리
const minDist = Math.abs(pos[0] - E[0]) + Math.abs(pos[1] - E[1]);
// case 1. 현 위치부터 목적지까지 최단 거리보다 남은 거리가 더 작다면 목적지까지 도달할 수 없다.
if (minDist > remaining) {
return;
}
// case 2. 남은 거리가 양수일 때 그 남은 거리가 짝수가 아니면 답이 아니다. (왔다갔다로 남은 거리를 소비할 수 없음)
// 도착 지점에 도달했을 때 "k보다 일찍 도착했다!" → "남은 거리가 짝수가 아니군" 을 검사하기엔 늦다 (시간 초과 발생함)
// 도착 지점까지의 최단거리보다 남은 거리가 더 길기 때문에, 잉여 거리를 예측하고, 그 잉여 거리가 짝수인지를 확인한다.
// 좀 더 가지를 칠 수 있다. (이걸 어떻게 생각해내는것임;)
if ((remaining - minDist) % 2 !== 0) {
return;
}

for (const [dx, dy, dirName] of dir) {
const nx = pos[0] + dx;
const ny = pos[1] + dy;

if (nx >= 1 && nx <= n && ny >= 1 && ny <= m) {
dfs([nx, ny], path + dirName);
if (answer !== "impossible") {
return;
}
}
}
}

dfs(S, "");

return answer;
}
11 changes: 6 additions & 5 deletions Programmers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
| --------- | --------- | --------- | --------- |
| 1845 | 폰켓몬 | [1845_폰켓몬.js](Level1/1845_폰켓몬.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/1845) |
| 12906 | 같은 숫자는 싫어 | [12906_같은_숫자는_싫어.js](Level1/12906_같은_숫자는_싫어.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12906) |
| 12909 | 올바른 괄호 | [12909_올바른_괄호.js](Level2/12909_올바른_괄호.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12909) |
| 12909 | 올바른 괄호 | [12909_올바른_괄호.js](Level2/12909_올바른_괄호.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12909) |
| 12910 | 나누어 떨어지는 숫자 배열 | [12910_나누어_떨어지는_숫자_배열.js](Level1/12910_나누어_떨어지는_숫자_배열.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12910) |
| 12924 | 숫자의 표현 | [12924_숫자의_표현.js](Level2/12924_숫자의_표현.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12924) |
| 12939 | 최댓값과 최솟값 | [12939_최댓값과_최솟값.js](Level2/12939_최댓값과_최솟값.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12939) |
Expand All @@ -32,13 +32,13 @@
| 42584 | 주식가격 | [42584_주식가격.js](Level2/42584_주식가격.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42584) |
| 42586 | 기능개발 | [42586_기능개발.js](Level2/42586_기능개발.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42586) |
| 42840 | 모의고사 | [42840_모의고사.js](Level1/42840_모의고사.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42840) |
| 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) |
| 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) |
| 42889 | 실패율 | [42889_실패율.js](Level1/42889_실패율.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42889) |
| 49993 | 스킬트리 | [49993_스킬트리.js](Level2/49993_스킬트리.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49993) |
| 49994 | 방문 길이 | [49994_방문_길이.js](Level2/49994_방문_길이.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49994) |
| 60057 | 문자열 압축 | [60057_문자열_압축.js](Level2/60057_문자열_압축.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60057) |
| 60062 | 외벽 점검 | [60062_외벽_점검.js](60062_외벽_점검.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60062) |
| 64061 | 크레인 인형뽑기 게임 | [64061_크레인_인형뽑기_게임.js](Level1/64061_크레인_인형뽑기_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64061) |
| 64061 | 크레인 인형뽑기 게임 | [64061_크레인_인형뽑기_게임.js](Level1/64061_크레인_인형뽑기_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64061) |
| 64062 | 징검다리 건너기 | [64062_징검다리_건너기.js](Level3/64062_징검다리_건너기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64062) |
| 64064 | 불량 사용자 | [64064_불량_사용자.js](Level3/64064_불량_사용자.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64064) |
| 64065 | 튜플 | [64065_튜플.js](Level2/64065_튜플.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64065) |
Expand All @@ -55,8 +55,8 @@
| 77486 | 다단계 칫솔 판매 | [77486_다단계_칫솔_판매.js](Level3/77486_다단계_칫솔_판매.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77486) |
| 77885 | 2개 이하로 다른 비트 | [77885_2개_이하로_다른_비트.js](Level2/77885_2개_이하로_다른_비트.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77885) |
| 81303 | 표 편집 | [81303_표_편집.js](Level3/81303_표_편집.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/81303) |
| 87390 | n^2 배열 자르기 | [87390_n^2_배열_자르기.js](Level2/87390_n^2_배열_자르기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/87390) |
| 92334 | 신고 결과 받기 | [92334_신고_결과_받기.js](Level1/92334_신고_결과_받기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92334) |
| 87390 | n^2 배열 자르기 | [87390_n^2_배열_자르기.js](Level2/87390_n^2_배열_자르기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/87390) |
| 92334 | 신고 결과 받기 | [92334_신고_결과_받기.js](Level1/92334_신고_결과_받기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92334) |
| 92341 | 주차 요금 계산 | [92341_주차_요금_계산.js](Level2/92341_주차_요금_계산.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92341) |
| 118666 | 성격 유형 검사하기 | [118666_성격_유형_검사하기.js](Level1/118666_성격_유형_검사하기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/118666) |
| 118667 | 두 큐 합 같게 만들기 | [118667_두_큐_합_같게_만들기.js](Level2/118667_두_큐_합_같게_만들기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/118667) |
Expand All @@ -67,6 +67,7 @@
| 121683 | 외톨이 알파벳.cpp | [121683_외톨이_알파벳.cpp](Unrated/121683_외톨이_알파벳.cpp) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
| 121683 | 외톨이 알파벳 | [121683_외톨이_알파벳.js](Unrated/121683_외톨이_알파벳.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
| 131127 | 할인 행사 | [131127_할인_행사.js](Level2/131127_할인_행사.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/131127) |
| 150365 | 미로 탈출 명령어 | [150365_미로_탈출_명령어.js](Level3/150365_미로_탈출_명령어.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/150365) |
| 150370 | 개인정보 수집 유효기간 | [150370_개인정보_수집_유효기간.js](Level1/150370_개인정보_수집_유효기간.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/150370) |
| 159993 | 미로 탈출 | [159993_미로_탈출.js](Level2/159993_미로_탈출.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/159993) |
| 159994 | 카드 뭉치 | [159994_카드_뭉치.js](Level1/159994_카드_뭉치.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/159994) |
Expand Down