알고리즘 문제 풀이/Javascript

Javascript[node.js] 백준 2174 로봇 시뮬레이션

맛대 2024. 5. 27. 18:12

https://www.acmicpc.net/problem/2174

로직

  • 구현문제
  • 땅의 현 상태를 저장하기 위해 2중 배열 생성(arr)
  • 각 로봇의 현재 좌표를 저장하기 위한 Object(robotPosition) => 배열로 만들었으면 좀 더 좋았을 듯
  • 각 로봇의 현재 방향을 저장하기 위한 배열(robotDirection)
  • 로봇의 명령
    • 왼쪽, 혹은 오른쪽으로 4번 돌게 되면 같은 방향을 보게 됨 => 명령 수를 4로 나머지 연산한 값만큼 수행
    • 회전을 구현하기 쉽게 하기 위해 { 'N':0, 'E':1,'S':2,'W':3 } 으로 저장 => 오른쪽 회전 시 1씩 증가, 왼쪽 회전시 1씩 감소
// input
const fs = require('fs');
const URI = process.platform === 'linux'? 0:'./2174.txt';
const [mapSize,robotCnt,...inputs] = fs.readFileSync(URI,'utf-8').toString().trim().split('\n');
const [cols,rows] = mapSize.split(' ').map(Number);
const [N,M] = robotCnt.split(' ').map(Number);
const positionData = inputs.slice(0,N);
const cmdData = inputs.slice(N);

function solution(positionData,cmdData,N,M,cols,rows){
    // 로봇 위치, 방향 설정
    function defineRobotPosition(positionData,rows,cols){
        const arr = Array.from({length:rows+1}, ()=> new Array(cols+1).fill(0));
        const robotPosition = {};
        const robotDirection = new Array(N+1).fill(0);
        const conversionDirectionToNumber = { 'N':0, 'E':1,'S':2,'W':3 };
        for (let i = 0; i<positionData.length ;i++){
            const [c,r,d] = positionData[i].split(' ').map((value,idx)=> idx<2? Number(value):value);
            const robotId = i+1;
            arr[r][c] = robotId;
            robotPosition[robotId] = [r,c];
            robotDirection[robotId] = conversionDirectionToNumber[d];
        }
        return [arr,robotDirection,robotPosition];
    }
    // 범위 밖 나가는지 확인
    function inrange(r,c,rows,cols){
        if (0<r && r <= rows && 0<c && c<= cols) return true;
        return false;
    }
    // 로봇 움직임
    function cmdOppertaion(robotId,cmd,cnt,rows,cols){
        const directionMove = [[1,0],[0,1],[-1,0],[0,-1]];
        if (cmd === 'R'){
            cnt %= 4;
            robotDirection[robotId] = (robotDirection[robotId] + cnt) % 4;
        } else if (cmd === 'L'){
            cnt %= 4;
            robotDirection[robotId] = (robotDirection[robotId] + 4 - cnt)%4;
        } else{
            const [originR,originC] = robotPosition[robotId];
            let r = originR;
            let c = originC
            const d = robotDirection[robotId];
            for (let _ = 0; _ < cnt;_++){
                const nr = r + directionMove[d][0];
                const nc = c + directionMove[d][1];
                if (!(inrange(nr,nc,rows,cols))) return 0
                if (arr[nr][nc] !==0) return arr[nr][nc]
                r = nr;
                c = nc;
            }
            arr[originR][originC] = 0;
            arr[r][c] = robotId;
            robotPosition[robotId] = [r,c];
        }

        return -1
    }

    const [arr,robotDirection,robotPosition] = defineRobotPosition(positionData,rows,cols);
    for (let i = 0; i<M; i++){
        const [robotId,cmd,cnt] = cmdData[i].split(' ').map((value,idx)=> idx !=1? Number(value):value);
        const result = cmdOppertaion(robotId,cmd,cnt,rows,cols);
        if (result === 0) return `Robot ${robotId} crashes into the wall`
        if (result >0 ) return `Robot ${robotId} crashes into robot ${result}`
    }
    return 'OK'
}

const ans = solution(positionData,cmdData,N,M,cols,rows);
console.log(ans);