문제
https://school.programmers.co.kr/learn/courses/30/lessons/172928
자바스크립트
- X축,Y축의 좌표평면을 생각하며 가로 방향을 nowX, 세로 방향을 nowY로 지칭했다.
- 반복되는 코드가 많아보이나 validation 처리를 위해 switch 문으로 분기 처리했다.
- 제출 후 정확도 90%로 통과하지 못했었다.
장애물이 있는지 확인하는 로직에서 처음에는 park[nowY - i][nowX] !== "O" 로 했었는데 생각해보니 처음 시작 위치인 S도 이동 가능한 좌표라는 것을 깨닫고 === "X"일 경우 return 하는 로직으로 변경했다.
function solution(park, routes) {
// 공원의 가로, 세로 크기
let [width, height] = [park[0].length, park.length]
// 현재 좌표(indexOf에서 index를 찾을 수 없을 경우 -1이기에 초기값 설정)
let [nowY, nowX] = [0, -1]
// 경로 체크 및 이동 함수
const movePath = (order) => {
const way = order[0]
const cnt = parseInt(order[2])
switch (way) {
case "N" :
for (let i = 1; i <= cnt; i++) {
// 공원 범위를 넘어가는지 확인
if (nowY - i < 0) {
return
}
// 이동 경로에 장애물이 있는지 확인
if (park[nowY - i][nowX] === "X") {
return
}
}
nowY -= cnt
break;
case "S" :
for (let i = 1; i <= cnt; i++) {
if (nowY + i >= height) {
return
}
if (park[nowY + i][nowX] === "X") {
return
}
}
nowY += cnt
break;
case "W" :
for (let i = 1; i <= cnt; i++) {
if (nowX - i < 0) {
return
}
if (park[nowY][nowX - i] === "X") {
return
}
}
nowX -= cnt
break;
case "E" :
for (let i = 1; i <= cnt; i++) {
if (nowX + i >= width) {
return
}
if (park[nowY][nowX + i] === "X") {
return
}
}
nowX += cnt
break;
default:
break;
}
}
// 출발좌표 찾기
park.some((row, index) => {
nowX = row.indexOf("S")
if (nowX >= 0) {
nowY = index
return true // true를 반환하면 루프 중단
}
})
// 이동 명령 수행하기
for (let i = 0; i < routes.length; i++) {
movePath(routes[i])
}
return [nowY, nowX]
}
'PS (Problem Solving) > Programmers' 카테고리의 다른 글
[프로그래머스] 덧칠하기 - 자바스크립트 (0) | 2024.10.14 |
---|---|
[프로그래머스] 방문 길이 - 자바스크립트 (0) | 2024.10.13 |
[프로그래머스] 대충 만든 자판 (0) | 2024.10.10 |
[프로그래머스] 추억 점수 (0) | 2024.10.10 |
[프로그래머스] 수 조작하기 1 (0) | 2024.10.10 |