알고리즘 문제 풀이/Javascript

[node.js] 1347 미로만들기

맛대 2025. 1. 15. 16:58

로직

  • 입력은 동작에 관한 정보뿐
  • 맵 크기를 모르기에 시작 좌표를 [51,51]부터 시작하여 명령에 따라 이동하는 좌표를 기록
    • 51,51인 이유는 동작이 총 50번이 일어나기에 0보다 작은 값이 안나오게 하기 위함
    • 좌표 기록을 row는 1000을 곱하여 1000*r + c 형태로 기록
  • 이후 기록된 좌표를 기준으로 맵을 그리는 방식
const solution = (commands)=>{
    const positionSet = (commands)=>{
        let [minRow,maxRow,minColumn,maxColumn] = [51,51,51,51];
        const dr = [1,0,-1,0];
        const dc = [0,-1,0,1];
        let [r,c,d] = [51,51,0];
        const position = new Set([51051]);
        for (const commnad of commands){
            switch (commnad) {
                case 'F':
                    [r,c] = [r+dr[d],c+dc[d]];
                    position.add(r*1000+c)
                    switch (d){
                        case 0:
                            maxRow = Math.max(maxRow,r);
                            break;
                        case 1:
                            minColumn = Math.min(minColumn,c);
                            break;
                        case 2:
                            minRow = Math.min(minRow,r);
                            break;
                        case 3:
                            maxColumn = Math.max(maxColumn,c);
                            break
                    };
                    break;
                case 'R':
                    d = (d+1)%4;
                    break;
                case 'L':
                    d = (d+3)%4;
                    break;
            };
        }
        return [minRow,maxRow,minColumn,maxColumn,position];
    }
    const [minRow,maxRow,minColumn,maxColumn,position] = positionSet(commands);
    const [R,C] = [maxRow-minRow+1,maxColumn-minColumn+1];
    const arr = Array.from({length:R},()=>Array.from({length:C}).fill('#'));
    for (const num of position){
        const [r,c] = [Math.floor(num/1000)-minRow,num%1000-minColumn];
        arr[r][c] = '.';
    }
    return arr;
}

const fs = require("fs");
const URI = process.platform === 'linux'? 0:'./1347.txt';
const [C,commands] = fs.readFileSync(URI,'utf-8').toString().trim().split('\n');
const ans = solution(commands)
ans.forEach((arr)=>console.log(arr.join('')));

풀면서 든 생각

  • 처음에는 100*100크기의 배열에서 50,50에서 시작하여 이동을 나타낸 후, 테투리에서 부터 필요없는 정보를 삭제하는 방식을 생각

  • 테두리를 삭제하는 방식이 너무 비효율적이라고 생각하여 이동 좌표만 기록해서 이를 이용하여 맵을 그리는 방식 채택

  • 이동에는 중복된 좌표로 이동하는 경우가 있으므로, Set 자료구조를 활용하자고 생각

    • javascript의 set이 python의 set과 동일하게 동작하나? 라는 생각
    • python의 경우 set에 tuple인 (1,1)을 두번 추가하면 동일한 데이터라고 판단
    • javascript의 경우 Set에 배열인 [1,1]을 두번 추가시, 메모리 주소를 기반으로 판단
    • [r,c] 형태로 set에 기록할 경우 의미가 없다고 판단
    • row에 1000을 곱하여 나머지 연산 형태로 좌표 파악
  • switch를 이용하면 코드가 깔끔해질까? 라는 생각에 시도

    • if 구문보다는 깔끔하지만, break를 걸어야 해서 python의 match에 비해 지저분하게 느껴짐
  • 알고리즘을 풀다 보면 python의 음수 인덱스가 너무 편하다는 것을 깨닫게 된다.

  • 다음번 문제는 input을 readline을 써보자.