코테 - 공원 산책

김민재·2025년 1월 27일
0

문제 설명

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다

정답

function solution(park, routes) {
    var answer = [];
    
    let Sindex; // 시작시 위치
    let Eindex; // 끝 위치
    
    const newPark = park.map((park,index) => {
        park = park.split('');
        
        if(park.findIndex((park) => park === 'S') !== -1) {
            Sindex = [index, park.findIndex((park) => park === 'S')];
        }
        return park;
    });
    
    const newParkLength = newPark.length - 1;
    const lastLength = newPark[newParkLength].length - 1;
    
    Eindex = [newParkLength, lastLength];
     
    for(let i = 0; i < routes.length; i++) {
        let [go, block] = routes[i].split(' ');
        
        block = Number(block);
        
        // 1. 해당위치에 값이 존재하는지 확인
        // 2. 가는 길에 X표시가 있는지 확인
        let goCheck = false; // 갈 수 있는지 확인
        
        switch(go) {
            case 'N':
                for(let i = 1; i <= block; i++) {
                    if(Sindex[0] - i >= 0) {
                        if(newPark[Sindex[0] - i][Sindex[1]] && 
                           newPark[Sindex[0] - i][Sindex[1]] != 'X') {
                            goCheck = true;
                        }
                        else {
                            goCheck = false;
                            break;
                        }
                    }
                    else {
                        goCheck = false;
                        break;
                    }
                }
                
                console.log(`N : ${goCheck}`);
                
                if(goCheck) {
                    Sindex[0] -= block;
                } 
                
                break;
                
            case 'S':
                for(let i = 1; i <= block; i++) {
                    if(Sindex[0] + i <= Eindex[0]) {
                        if(newPark[Sindex[0] + i][Sindex[1]] && 
                           newPark[Sindex[0] + i][Sindex[1]] != 'X') {
                            goCheck = true;
                        }
                        else {
                            goCheck = false;
                            break;
                        }
                    }
                    else {
                        goCheck = false;
                        break;
                    }
                }
                
                console.log(`S : ${goCheck}`);
                
                if(goCheck) {
                    Sindex[0] += block;
                }
                
                break;
            
            case 'W':
                for(let i = 1; i <= block; i++) {
                    if(Sindex[1] - i >= 0 ) {
                        if(newPark[Sindex[0]][Sindex[1] - i] && 
                           newPark[Sindex[0]][Sindex[1] - i] != 'X') {
                            goCheck = true;
                        }
                        else {
                            goCheck = false;
                            break;
                        }
                    }
                    else {
                        goCheck = false;
                        break;
                    }
                }
                
                console.log(`W : ${goCheck}`);
                
                if(goCheck) {
                    Sindex[1] -= block;
                }
                
                break;
           
            case 'E':
                for(let i = 1; i <= block; i++) {
                    if(Sindex[1] + i <= Eindex[1]) {
                        if(newPark[Sindex[0]][Sindex[1] + i] && 
                           newPark[Sindex[0]][Sindex[1] + i] != 'X') {
                            goCheck = true;
                        }
                        else {
                            goCheck = false;
                            break;
                        }
                    }
                    else {
                        goCheck = false;
                        break;
                    }
                }
                
                console.log(`E : ${goCheck}`);
                
                if(goCheck) {
                    Sindex[1] += block;
                }
                
                break;
        }
        
    }
    
    
    return Sindex;
}

풀면서 어려웠던 점은 각 방향마다 다른 작업을 처리해야하는 점과 범위에서 벗어난 것에 대한 처리였다.

newPark[Sindex[0]][Sindex[1] + i]에서 만약 Sindex[1] + i의 값이 범위에 벗어나게 된다면 '0'이 되거나 또는 undefined가 되는 경우가 생겨버렸다.
'0'이 되어버리는 이유는 범위를 벗어났을 때 모종의 처리가 되어버리는 것 같은데 정확한 이유는 찾지 못하였다.

이 문제를 해결하기 위해서 Sindex의 범위를 벗어나지 못하도록 조건문을 걸어줄 필요가 있었고
if(Sindex[1] + i <= Eindex[1])
를 통해서 더이상 같은 문제가 발생하지 않게 하였다.

profile
ㅇㅇ

0개의 댓글