티스토리 뷰
문제
문제는 여기에서 확인
문제풀이
N, M의 크기가 크지 않고 모든 방향을 탐색해야 하므로 완전 탐색을 사용한다. 청소 가능한 방향을 우선으로 깊이 탐색하므로 DFS를 사용했다.
1.청소한 곳을 방문 처리할 visited 배열을 생성한다.
2. 문제에 적힌 대로 북동남서(0, 1, 2, 3) 방향 배열을 생성한다.
// 북, 동, 남, 서
const dr = [-1, 0, 1, 0];
const dc = [0, 1, 0, -1];
3. 현재 위치를 방문처리 하고 DFS를 수행한다.
POINT
- 반시계 방향으로 회전하므로 방향은 +1이 아닌 +3으로 계산해야 한다.
- 네 방향 모두 청소하여 후진할 때는 방향을 유지한 채로 이동한다.
전체 코드
const fs = require("fs");
const [[n, m], [r, c, d], ...graph] = fs.readFileSync("/dev/stdin").toString().trim().split("\n")
.map(line => line.split(" ").map(Number));
const visited = Array.from(new Array(n), () => Array(m).fill(false));
// 북동남서
const dr = [-1, 0, 1, 0];
const dc = [0, 1, 0, -1];
let answer = 1; // 현재 위치 카운트
visited[r][c] = true; // 현재 위치 방문 처리
dfs(r, c, d);
console.log(answer);
function dfs(r, c, d) {
for (let i = 0; i < 4; i++) {
d = (d + 3) % 4; // 반시계 방향으로 90도 회전
const nr = r + dr[d];
const nc = c + dc[d];
// 범위를 벗어나면 패스
if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
// 벽이면 패스
if (graph[nr][nc] === 1) continue;
// 아직 청소하지 않았으면
if (graph[nr][nc] === 0 && !visited[nr][nc]) {
visited[nr][nc] = true;
answer++;
dfs(nr, nc, d);
return; // 네 방향 탐색 종료
}
}
// 네 방향 모두 이미 청소했으면
d = (d + 2) % 4; // 후진 방향
const nr = r + dr[d];
const nc = c + dc[d];
// 범위를 벗어나면 종료
if (nr < 0 || nr >= n || nc < 0 || nc >= m) return;
// 벽이면 종료
if (graph[nr][nc] === 1) return;
// 빈 칸이면 후진
if (graph[nr][nc] === 0) dfs(nr, nc, (d + 2) % 4); // 방향을 유지한 채로 후진
}
'🧩 알고리즘' 카테고리의 다른 글
[프로그래머스] 연도별 대장균 크기의 편차 구하기 - SQL (1) | 2024.11.29 |
---|---|
[백준] 15686 치킨 배달 - Node.js (0) | 2024.11.23 |
[백준] 14719 빗물 - node.js (1) | 2023.06.13 |
[백준] 18428 감시 피하기 - Node.js (1) | 2023.05.02 |
[백준] 14888 연산자 끼워넣기 - Node.js (0) | 2023.05.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코드분석
- dfs
- flutter
- python
- rn
- Spotify
- 알고리즘
- javascript
- 코어자바스크립트
- 비동기
- fetch
- 백트래킹
- Unsplash
- 코딩테스트
- backtracking
- 백준
- 코테
- 다이나믹프로그래밍
- React
- node.js
- 프로그래머스
- React-native
- React.js
- 이벤트루프
- 문제풀이
- p5js
- Python3
- DP
- nodeJS
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함