몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 빛의 경로 사이클 {언어 : JavaScript} [다시 풀어 보기] 본문

알고리즘/다시 풀어 보기

프로그래머스 [Lv. 2] 빛의 경로 사이클 {언어 : JavaScript} [다시 풀어 보기]

스위태니 2024. 5. 1. 22:51

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/86052?language=javascript

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(grid) {
    const n = grid.length;
    const m = grid[0].length;
    const dr = [-1, 0, 1, 0];  // 상, 우, 하, 좌 순으로 행의 변화
    const dc = [0, 1, 0, -1];  // 상, 우, 하, 좌 순으로 열의 변화
    
    const visited = new Array(n).fill().map(() => new Array(m).fill().map(() => new Array(4).fill(false)));
    const results = [];
    
    for (let r = 0; r < n; r++) {
        for (let c = 0; c < m; c++) {
            for (let d = 0; d < 4; d++) {
                if (!visited[r][c][d]) {
                    let cycleLength = 0;
                    let x = r, y = c, dir = d;
                    
                    while (!visited[x][y][dir]) {
                        visited[x][y][dir] = true;
                        cycleLength++;
                        
                        if (grid[x][y] === 'L') {
                            dir = (dir + 3) % 4; // 좌회전
                        } else if (grid[x][y] === 'R') {
                            dir = (dir + 1) % 4; // 우회전
                        }
                        
                        x = (x + dr[dir] + n) % n;
                        y = (y + dc[dir] + m) % m;
                    }
                    
                    results.push(cycleLength);
                }
            }
        }
    }
    
    return results.sort((a, b) => a - b);
}

풀이 방법

  1. 방문배열을 3차원 배열로 만든 뒤 동선을 추적한다.
  2. 동선을 추적할 때 이미 지나간 길이면 멈추거나 추적을 시작하지 않는다.
  3. 추적을 하는 과정에서 길이를 측정하고 추적이 끝나면 results에 push한다.
  4. results 값은 오름차순으로 정렬한다.

느낀점

  • 3차원 방문 배열을 떠올리지 못해 딕셔너리를 썼다.
  • 동선을 추적하는 과정에서 좌 우 방향 전환에 문제가 있었다.
  • 파이썬으로 꼭 다시 풀어보면 좋을 것 같은 문제이다.