프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
✓ 풀이과정
처음 시도한 풀이과정은 아래와 같습니다
1. 전달받은 park에서 width, height를 구하고 S의 좌표를 [y, x] 형태로 저장합니다.
2. routes 를 순회하며 1에서 저장했던 현재의 좌표에서 해당 방향으로 거리만큼 이동하는데
공원 크기를 넘어가거나, X를 발견하면 이동하지 않고, 조건을 통과하면 현재의 좌표를 이동한 좌표로 저장합니다
function solution(park, routes) {
let answer = [];
let w = park[0].length;
let h = park.length;
m: for (let i = 0; i < h; i++) {
const parkY = park[i].split("");
for (let j = 0; j < w; j++) {
const parkX = parkY[j];
if (parkX === "S") {
answer = [i, j];
break m;
}
}
}
mm: for (let i = 0; i < routes.length; i++) {
const route = routes[i].split(" ");
let y = answer[0];
let x = answer[1];
let way = route[0];
let street = Number(route[1]);
for (let j = 0; j < street; j++) {
if (way === "E") x += 1;
else if (way === "W") x -= 1;
else if (way === "S") y += 1;
else if (way === "N") y -= 1;
if (y < 0 || y >= h || x < 0 || x >= w || park[y].split("")[x] === "X") {
continue mm;
}
}
answer = [y, x];
}
return answer;
}
1. 문자열을 불필요하게 split으로 배열형태로 변환하는 부분 개선
(js에서 문자열은 배열과 동일하게 str[n]의 형태로 접근 가능)
2. for문에 라벨을 붙여서 제어하는 방식 개선 ⭐️
3. 변수 선언은 구조 분해 할당 활용
4. 방향 if-else문 개선 ⭐️⭐️
여기서 4번 항목은 앞으로 2차원 배열 좌표 문제가 나왔을 때도 같은 방식으로 사용하게 될 것 같은데
방향마다 좌표를 별도의 객체로 저장해서 계산하면 효율적으로 계산할 수 있습니다
▪︎ 개선 전
if (way === "E") x += 1;
else if (way === "W") x -= 1;
else if (way === "S") y += 1;
else if (way === "N") y -= 1;
▪︎ 개선 후
let dir = {
E: [0, 1],
W: [0, -1],
S: [1, 0],
N: [-1, 0],
};
let [dirY, dirX] = dir[way];
y += dirY;
x += dirX;
방향별로 추가될 [y, x] 값을 저장해두고 현재 좌표에 해당 값을 더해서 이동하는 방식으로 변경했습니다
✓ 최종코드
function solution(park, routes) {
let answer = [];
let w = park[0].length;
let h = park.length;
let dir = {
E: [0, 1],
W: [0, -1],
S: [1, 0],
N: [-1, 0],
};
const findStart = () => {
for (let i = 0; i < h; i++) {
for (let j = 0; j < w; j++) {
if (park[i][j] === "S") return [i, j];
}
}
};
answer = findStart();
const moveRoute = (answer, route) => {
let [y, x] = answer;
let [way, street] = route.split(" ");
for (let j = 0; j < Number(street); j++) {
let [dirY, dirX] = dir[way];
y += dirY;
x += dirX;
if (y < 0 || y >= h || x < 0 || x >= w || park[y][x] === "X") {
return;
}
}
return [y, x];
};
for (const route of routes) {
let newRoute = moveRoute(answer, route);
if (newRoute) answer = newRoute;
}
return answer;
}
이차원 배열로 푸는 좌표 문제였는데 배열 좌표 문제 형태에 익숙하지 않아서 조건을 검증하는 과정에서 시간이 걸렸던 것 같습니다 1.5단계처럼 느껴졌는데 비슷한 유형의 문제에서 다음에는 어떤 식으로 접근해야 할지 조금은 감을 잡게 된 문제였습니다!
'프로그래머스 > Lv1' 카테고리의 다른 글
| [프로그래머스/Javascript] Lv.1 둘만의 암호 (0) | 2026.01.20 |
|---|---|
| [프로그래머스/Javascript] Lv.1 2016년 (0) | 2026.01.19 |
| [프로그래머스/Javascript] Lv.1 완주하지 못한 선수 (0) | 2026.01.15 |
| [프로그래머스/Javascript] Lv.1 모의고사 (0) | 2026.01.15 |
| [프로그래머스/Javascript] Lv.1 햄버거 만들기 (0) | 2026.01.14 |