PS (Problem Solving)/Programmers

[프로그래머스] 공원 산책

캐럿노트 2024. 10. 12. 00:56

문제

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

자바스크립트

  • 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]
}