프로그래머스

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

so_yeon_- 2024. 11. 27. 21:07

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


1차 제출

function solution(park, routes) {
    const rowIndex = park.findIndex(row => row.includes("S"));
    const colIndex = park[rowIndex].indexOf("S");
    const startPark = [rowIndex, colIndex];

    const rowSize = park.length;
    const colSize = park[0].length;

    let temp = startPark;
    for (route of routes) {
        const move = Number(route.substr(-1));

        switch (route.substr(0, 1)) {
            case "N":
                if (temp[0] - move >= 0) {
                    let result = true;
                    for (var i = 0; i < move; i++) {
                        if (park[temp[0] - (i + 1)][temp[1]] == "X") {
                            result = false;
                            break;
                        }
                    }
                    if (result) {
                        temp[0] = temp[0] - move;
                    }
                }
                break;
            case "S":
                if (temp[0] + move < rowSize) {
                    let result = true;
                    for (var i = 0; i < move; i++) {
                        if (park[temp[0] + (i + 1)][temp[1]] == "X") {
                            result = false;
                            break;
                        }
                    }
                    if (result) {
                        temp[0] = temp[0] + move;
                    }
                }
                break;
            case "W":
                if (temp[1] - move >= 0) {
                    let result = true;
                    for (var i = 0; i < move; i++) {
                        if (park[temp[0]][temp[1] - (i + 1)] == "X") {
                            result = false;
                            break;
                        }
                    }
                    if (result) {
                        temp[1] = temp[1] - move;
                    }
                }
                break;
            case "E":
                if (temp[1] + move < colSize) {
                    let result = true;
                    for (var i = 0; i < move; i++) {
                        if (park[temp[0]][temp[1] + (i + 1)] == "X") {
                            result = false;
                            break;
                        }
                    }
                    if (result) {
                        temp[1] = temp[1] + move;
                    }
                }
                break;
        }
    }

    return temp;
}

결과 : 100점

- 답은 맞았으나, 코드가 너무너무 길고 지저분해서 수정이 필요하다고 느꼈다.


수정

function solution(park, routes) {
    const rowIndex = park.findIndex(row => row.includes("S"));
    const colIndex = park[rowIndex].indexOf("S");
    const startPark = [rowIndex, colIndex];

    const rowSize = park.length;
    const colSize = park[0].length;

    const directions = {
        N: [-1, 0], // 북쪽
        S: [1, 0], // 남쪽
        W: [0, -1], // 서쪽
        E: [0, 1] // 동쪽
    };

    let position = startPark;

    for (let route of routes) {
        const direction = route[0];
        const move = Number(route.slice(-1));
        const [dx, dy] = directions[direction];

        let canMove = true;
        for (let i = 1; i <= move; i++) {
            const newRow = position[0] + dx * i;
            const newCol = position[1] + dy * i;
            if (newRow < 0 || newRow >= rowSize || newCol < 0 || newCol >= colSize || park[newRow][newCol] === 'X') {
                canMove = false;
                break;
            }
        }

        if (canMove) {
            position[0] += dx * move;
            position[1] += dy * move;
        }
    }

    return position;
}