Skip to content

Conversation

@Moonjonghoo
Copy link
Collaborator

@Moonjonghoo Moonjonghoo commented Feb 25, 2025

๐Ÿ“Œ ํ‘ผ ๋ฌธ์ œ

  • DFS์™€ BFS
  • ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ
  • ์ „๋ ฅ๋ง์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ
  • ํƒ€๊ฒŸ ๋„˜๋ฒ„

๐Ÿ“ ๊ฐ„๋‹จํ•œ ํ’€์ด ๊ณผ์ •

DFS์™€ BFS

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์™€ BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ
  • ์ž…๋ ฅ๋œ ๊ฐ„์„ ์„ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑ ํ›„, DFS์™€ BFS๋ฅผ ๊ฐ๊ฐ ์ˆ˜ํ–‰
  • DFS๋Š” ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, BFS๋Š” ํ๋ฅผ ์ด์šฉํ•ด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const [N, M, V] = input[0].split(" ").map(Number);
const edges = input.slice(1).map((line) => line.split(" ").map(Number));

const graph = Array.from({ length: N + 1 }, () => []);
edges.forEach(([a, b]) => {
  graph[a].push(b);
  graph[b].push(a);
});
graph.forEach((node) => node.sort((a, b) => a - b));

const dfs = (v, visited = []) => {
  if (visited.includes(v)) return;
  visited.push(v);
  graph[v].forEach((n) => dfs(n, visited));
  return visited;
};

const bfs = (v) => {
  let queue = [v],
    visited = [];
  while (queue.length) {
    let node = queue.shift();
    if (!visited.includes(node)) {
      visited.push(node);
      queue.push(...graph[node].filter((n) => !visited.includes(n)));
    }
  }
  return visited;
};

console.log(dfs(V, []).join(" "));
console.log(bfs(V).join(" "));

๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ

  • BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
  • ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋ฐฉํ–ฅ(์ƒ, ํ•˜, ์ขŒ, ์šฐ)์„ ์ •์˜ํ•˜๊ณ  ํ๋ฅผ ํ™œ์šฉํ•ด ํƒ์ƒ‰
  • ๋„์ฐฉ ์ง€์ ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜, ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด -1 ๋ฐ˜ํ™˜
function solution(maps) {
  let n = maps.length;
  let m = maps[0].length;
  let answer = 1;
  let visited = maps;
  const dx = [-1, 1, 0, 0];
  const dy = [0, 0, -1, 1];
  let queue = [];
  queue.push([0, 0]);
  visited[0][0] = 0;

  while (queue.length > 0) {
    let size = queue.length;

    for (let i = 0; i < size; i++) {
      let [x, y] = queue.shift();

      for (let j = 0; j < 4; j++) {
        let nx = x + dx[j];
        let ny = y + dy[j];

        if (nx >= 0 && nx < n && ny >= 0 && ny < m && visited[nx][ny] === 1) {
          if (nx == n - 1 && ny == m - 1) {
            return ++answer;
          }
          queue.push([nx, ny]);
          visited[nx][ny] = 0;
        }
      }
    }
    answer++;
  }
  return -1;
}

์ „๋ ฅ๋ง์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ

  • DFS๋กœ ์ „๋ ฅ๋ง์„ ๋‚˜๋ˆ  ๊ฐ๊ฐ์˜ ์†ก์ „ํƒ‘ ๊ฐœ์ˆ˜ ์ฐจ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฌธ์ œ
  • ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ณ , DFS๋กœ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•จ
  • ๊ฐ ๊ฒฝ์šฐ์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•ด ์ตœ์†Œ๊ฐ’์„ ๊ฐฑ์‹ 
function solution(n, wires) {
  let answer = Infinity;

  function dfs(graph, start, visited) {
    visited[start] = true;
    let count = 1;

    for (let i = 0; i < graph[start].length; i++) {
      const neighbor = graph[start][i];
      if (!visited[neighbor]) {
        count += dfs(graph, neighbor, visited);
      }
    }

    return count;
  }

  for (let i = 0; i < n - 1; i++) {
    const graph = Array(n)
      .fill(null)
      .map(() => []);
    for (let j = 0; j < n - 1; j++) {
      if (i === j) continue;
      const [a, b] = wires[j];
      graph[a - 1].push(b - 1);
      graph[b - 1].push(a - 1);
    }

    const visited = Array(n).fill(false);
    let count1 = 0;
    let count2 = 0;

    for (let j = 0; j < n; j++) {
      if (!visited[j]) {
        if (count1 === 0) {
          count1 = dfs(graph, j, visited);
        } else {
          count2 = dfs(graph, j, visited);
        }
      }
    }

    const diff = Math.abs(count1 - count2);
    answer = Math.min(answer, diff);
  }

  return answer;
}

ํƒ€๊ฒŸ ๋„˜๋ฒ„

  • DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•ด ํƒ€๊ฒŸ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ
  • ๊ฐ ์ˆซ์ž๋ฅผ + ๋˜๋Š” -๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ํƒ์ƒ‰
  • ์ตœ์ข…์ ์œผ๋กœ ํƒ€๊ฒŸ ๋„˜๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
function solution(numbers, target) {
  let n = numbers.length;
  let check = Array.from({ length: n }, () => false);
  let answer = 0;
  function DFS(v) {
    if (v === n) {
      let sum = 0;
      for (let i = 0; i < n; i++) {
        if (check[i] === true) {
          sum += numbers[i];
        } else if (check[i] === false) {
          sum -= numbers[i];
        }
      }
      if (sum === target) answer++;
    } else {
      check[v] = true;
      DFS(v + 1);
      check[v] = false;
      DFS(v + 1);
    }
  }
  DFS(0);
  return answer;
}

@JooKangsan JooKangsan merged commit 3bfce03 into main Feb 27, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants