From 8b58676e2782468d2793d95c7b84f1491ab64f80 Mon Sep 17 00:00:00 2001 From: yoouyeon Date: Wed, 22 Oct 2025 18:16:33 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A1=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=98=EB=A8=B8=EC=8A=A4=20150365=20-=20=EB=AF=B8=EB=A1=9C?= =?UTF-8?q?=20=ED=83=88=EC=B6=9C=20=EB=AA=85=EB=A0=B9=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_\353\252\205\353\240\271\354\226\264.js" | 64 +++++++++++++++++++ Programmers/README.md | 11 ++-- 2 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 "Programmers/Level3/150365_\353\257\270\353\241\234_\355\203\210\354\266\234_\353\252\205\353\240\271\354\226\264.js" diff --git "a/Programmers/Level3/150365_\353\257\270\353\241\234_\355\203\210\354\266\234_\353\252\205\353\240\271\354\226\264.js" "b/Programmers/Level3/150365_\353\257\270\353\241\234_\355\203\210\354\266\234_\353\252\205\353\240\271\354\226\264.js" new file mode 100644 index 0000000..d5941c6 --- /dev/null +++ "b/Programmers/Level3/150365_\353\257\270\353\241\234_\355\203\210\354\266\234_\353\252\205\353\240\271\354\226\264.js" @@ -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; +} diff --git a/Programmers/README.md b/Programmers/README.md index 2e51a38..1864b6a 100644 --- a/Programmers/README.md +++ b/Programmers/README.md @@ -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) | @@ -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) | @@ -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) | @@ -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) |