-
빛의 경로 사이클코딩 테스트/프로그래머스 2024. 5. 21. 17:03
https://school.programmers.co.kr/learn/courses/30/lessons/86052?language=javascript
- 사이클의 존재 유무와 그것의 길이는 이미 지나쳤던 경로를 한 번 더 지나는지를 판별하면 알 수 있음.
- 처음에 해맸던 점은 이것을 0,0 지점에 위치한 노드만 봐야하는지와 모든 지점을 거쳐야지만 사이클이 되는지였다.
- 결과적으로 한 지점에서 출발하여 모든 지점을 지나칠 필요는 없으며, (0,0)이 아니더라도 사이클을 찾으면 되느 것이었다.
- 즉, 반복문을 통하여 (0,0)~(n-1,m-1) 까지 모든 점을 돌아다니면서 사이클을 찾으면 됨
- 이때 방문 그래프 visited를 선언할 것인데 한 번 지나쳤던 경로라면 위에서 언급했던 모든 점을 돌아댕길 때 또 탐색 할 필요는 없음 ( 사이클이 있든 없든 이전에 탐색했던 경로라면 결과는 같으니까)
- 또한, 한 지점에서 나아갈 수 있는 방향은 4방향이므로 visited는 [i][j][4] 가 된다.
const visited = Array.from({ length: n }, () => Array.from({ length: m }, () => [-1, -1, -1, -1]) );
- 이후에는 탐색을 통해서 left,right 에 대한 방향과 범위를 넘어섰을 때의 좌표값만 유의하면 어려운 점은 없음
const dy = [0, 1, 0, -1]; const dx = [1, 0, -1, 0]; // Right,Down,Left,UP // "L" : -1 // "R": +1 const bfs = (ia, visited, grid, sx, sy) => { const n = grid.length; const m = grid[0].length; visited[sx][sy][ia] = 0; const q = [[sx, sy, ia]]; while (q.length) { const [x, y, dir] = q.shift(); let nextDir = dir; if (grid[x][y] === 'R') nextDir = (nextDir + 1) % 4; if (grid[x][y] === 'L') nextDir = (nextDir + 3) % 4; let nx = x + dx[nextDir]; let ny = y + dy[nextDir]; if (nx < 0) nx = n - 1; if (ny < 0) ny = m - 1; if (nx >= n) nx = 0; if (ny >= m) ny = 0; if (visited[nx][ny][nextDir] !== -1) return visited[x][y][dir] + 1; visited[nx][ny][nextDir] = visited[x][y][dir] + 1; q.push([nx, ny, nextDir]); } return false; }; function solution(grid) { const answer = []; const n = grid.length; const m = grid[0].length; const gr = Array.from({ length: n }, () => Array.from({ length: m }, () => [-1, -1, -1, -1]) ); for (let x = 0; x < n; x++) { for (let y = 0; y < m; y++) { for (let i = 0; i < 4; i++) { if (gr[x][y][i] !== -1) continue; const result = bfs(i, gr, grid, x, y); if (result !== false) { answer.push(result); } } } } return answer.sort((a, b) => a - b); // sort 안해줘서 계속 틀렸음 }
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[lv3]코딩 테스트 공부 (자바스크립트) (0) 2024.05.22 2차원 동전 뒤집기 (0) 2024.05.20 스타 수열 (Javascript) (0) 2024.05.17 카드 짝 맞추기 (자바스크립트) (0) 2024.05.15 카운트 다운 (javascript) (0) 2024.05.14