[백준 1743/ JavaScript] 음식물 피하기

어제보다·2024년 9월 25일


출처: https://velog.io/@white0_0/Javascript-%EB%B0%B1%EC%A4%80-1743-%EC%9D%8C%EC%8B%9D%EB%AC%BC-%ED%94%BC%ED%95%98%EA%B8%B0

✅ 문제 설명

✅ 풀이 설명

  1. 반복문 -> graph에서 음식물을 만나면 dfs 함수 호출.
  2. 음식물 주변을 확인, 만약에 상하좌우에 음식물을 만나게 되면 조건문(graph범위 안에 있는지, 방문한적이 있는지 확인) 후 만족하면 result에 1 더하고 재귀(dfs 호출).
  3. 연결된 음식물이 더 이상 없을 때(dfs함수를 더 이상 호출하지 않게 될 때)까지의 result값 answer 배열에 push.
  4. 반복문이 끝나고 answer 배열에서의 최대값 반환

✅내 코드

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString();
input = input.split("\n");
const [N, M, K] = input[0].split(" ").map(Number);

// 입력값을 배열로 만들어줌
const answer = [];

// 음식물 쓰레기가 있는 좌표를 배열로 만들어줌
let newArr = [];
for (let i = 1; i <= K; i++) {
  const arr = input[i].split(" ").map(Number);
  newArr.push(arr);
}

const graph = Array.from({ length: N }, () => Array(M).fill(0));

// 방문 여부를 체크할 visited 배열
const visited = Array.from({ length: N }, () => Array(M).fill(false));

const dx = [0, 0, 1, -1];
const dy = [1, -1, 0, 0];

let result = 1;

// 음식물 쓰레기가 있는 좌표에 1로 표시
newArr.forEach(([y, x]) => {
  graph[y - 1][x - 1] = 1;
});

function dfs(y, x) {
  // 방문 처리
  visited[y][x] = true;

  // 상하좌우 확인
  for (let k = 0; k < 4; k++) {
    let ny = y + dy[k];
    let nx = x + dx[k];

    // 상하좌우가 graph 범위 안에 있고, 음식물 쓰레기가 있고, 방문하지 않았다면
    if (
      ny >= 0 &&
      ny < N &&
      nx >= 0 &&
      nx < M &&
      graph[ny][nx] === 1 &&
      !visited[ny][nx]
    ) {
      result += 1;
      dfs(ny, nx);
    }
  }
}

for (let i = 0; i < N; i++) {
  for (let j = 0; j < M; j++) {
    if (graph[i][j] == 1) {
      dfs(i, j);
      answer.push(result);
      // result 초기화
      result = 1;
    }
  }
}

console.log(Math.max(...answer));
profile
똑똑해지는중...

0개의 댓글