티스토리 뷰
const line = require("fs").readFileSync("/dev/stdin", "utf8");
let input = line.trim().split("\n");
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
const [m, n] = input[0].split(" ").map(Number);
let tomatos = [];
let queue = [];
let zero = 0;
let cnt = 0;
minimumDate();
function minimumDate() {
//토마토밭을 만드는 for문
for (let i = 1; i < n + 1; i++) {
tomatos.push(input[i].split(" ").map(Number));
for (let j = 0; j < tomatos[i - 1].length; j++) {
//1인 부분을 queue에 넣어 한번에 동작하게 함
if (tomatos[i - 1][j] === 1) queue.push([i - 1, j]);
//0인 부분을 모두 구해 놓는다.
if (tomatos[i - 1][j] === 0) zero++;
}
}
bfs(queue);
zero !== 0 ? console.log(-1) : console.log(cnt - 2);
}
function bfs(queue) {
//shift는 시간이 오래걸리므로 Cursor를 하나 둔다.
let queueCursor = 0;
while (queue.length > queueCursor) {
const [x, y] = queue[queueCursor++];
cnt = tomatos[x][y] + 1;
for (let i in dx) {
let nx = x + dx[i];
let ny = y + dy[i];
if (check(nx, ny) && tomatos[nx][ny] === 0) {
zero--;
queue.push([nx, ny]);
tomatos[nx][ny] = cnt;
}
}
}
}
function check(x, y) {
if (x > -1 && y > -1 && x < n && y < m) return true;
return false;
}
ㅇㅇㅇㅇ토마토 같은 경우는 bfs에서 queue를 구현할 때 shift로 구현하게 되면 시간초과가 떳다.
그래서 queue의 값을 삭제하지않고 몇번째 있는지만 확인하여 진행하였다.
그리고 토마토 밭에 0이 남은 곳을 찾는 로직은 처음에 받을 때부터 0인 부분의 개수를 구한다음
0이 바뀔때마다 개수를 -1하면서 마지막에 개수가 0이라면 통과이고 아니면 -1로 나오게 하였다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 7562 [nodejs] 나이트의 이동 (0) | 2021.02.04 |
---|---|
백준 7569 [nodejs] 토마토 3차원버전 (0) | 2021.02.04 |
백준2178[nodejs] 미로 탐색 (0) | 2021.02.04 |
백준1012[nodejs]유기농 배추 (0) | 2021.02.04 |
백준2667[nodejs]단지번호붙이기 (0) | 2021.02.04 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- nodemailer error
- 로그인
- 카카오2018[1차]
- 바이러스 dfs
- 534 error
- JavaScript
- Level 1
- 회원가입
- Replace
- smtp error
- AWS
- Express
- 백준
- GROUP BY
- 정규표현식
- slice
- left join
- SQL
- tolowercase
- 코드테스트
- 코딩테스트
- nodejs
- 토마토3차원
- Split
- 백준 7569 node
- 숫자야구게임
- sort
- 프로그래머스
- 백준 7562 node
- JOIN
- Total
- Today
- Yesterday