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);
'알고리즘 문제 풀이 > Javascript' 카테고리의 다른 글
Javascript(nodejs) 백준 1756 피자 굽기 (0) | 2024.06.03 |
---|---|
javascript(nodeJS) 백준 14719 빗물 (0) | 2024.05.28 |
Javascript [nodeJS] 백준 7682 틱택토 (0) | 2024.05.24 |
javascript (nodeJS) 백준 2302 극장 좌석 (0) | 2024.04.16 |
javascript (nodeJS) 백준 23083 꿀벌 승연이 (0) | 2024.04.12 |