๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง  ์•Œ๊ณ ๋ฆฌ์ฆ˜

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค][PCCP ๊ธฐ์ถœ๋ฌธ์ œ] 2๋ฒˆ / ์„์œ  ์‹œ์ถ” JSํ’€์ด

by megan07 2023. 12. 29.

๋ฌธ์ œ ๋งํฌ

PCCP 2๋ฒˆ

 

ํ’€์ด ๋ฐฉ๋ฒ•

์ •๋‹ต์„ ๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ’๋“ค์€

  1. ๋ชจ๋“  ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ
  2. ์‹œ์ถ”๊ด€์„ ๋šซ์„ ์ˆ˜ ์žˆ๋Š” ์—ด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ์˜ ํ•ฉ
  • ๊ฐ ์—ด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ์˜ ํ•ฉ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด land์˜ ์—ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ 1์ฐจ์› ๋ฐฐ์—ด(oilArr)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • land์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ bfs๋กœ ๋ชจ๋“  ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ•œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ col๋ณ„๋กœ ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ oilArr์— ๋”ํ•ด์ค๋‹ˆ๋‹ค.

bfs๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์‹œ๊ฐ„ ์ œํ•œ์— ๊ฑธ๋ฆด ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์ง์ ‘ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค

 

1. ๋‚ด ํ’€์ด

class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.front = null;
    this.rear = null;
    this.size = 0;
  }

  enqueue(val) {
    const node = new Node(val);
    if (!this.front) {
      this.front = node;
      this.rear = node;
    } else {
      this.rear.next = node;
      this.rear = node;
    }
    return ++this.size;
  }

  dequeue() {
    if (!this.front) return null;
    const node = this.front;

    if (this.front === this.rear) {
      this.rear = null;
    }

    this.front = this.front.next;
    this.size--;
    return node.val;
  }
}

function solution(land) {
  const COL = land[0].length;
  const ROW = land.length;

  const dr = [0, 0, 1, -1];
  const dc = [1, -1, 0, 0];

  const q = new Queue();

  //์‹œ์ถ”๊ด€์„ ๋šซ์—ˆ์„ ๋•Œ ๊ฐ ์ปฌ๋Ÿผ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
  const oilArr = new Array(COL).fill(0);

  //๋ชจ๋“  ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ์„์œ  ๋ฉ์–ด๋ฆฌ ์ˆœํšŒ
  for (let r = 0; r < ROW; r++) {
    for (let c = 0; c < COL; c++) {
      //์„์œ ๊ฐ€ ์—†๋Š” ๋•…์ผ ๊ฒฝ์šฐ ๋‹ค์Œ ์นธ์œผ๋กœ ์ด๋™
      if (!land[r][c]) continue;

      //๋ฐฉ๋ฌธํ•œ ์ปฌ๋Ÿผ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
      const visitedCol = new Set();
      //์„์œ  ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
      let oilSize = 0;

      q.enqueue({ currentR: r, currentC: c });
      //๋ฐฉ๋ฌธํ•œ ์นธ์€ 0์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
      land[r][c] = 0;
      oilSize++;
      visitedCol.add(c);

      //ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
      while (q.size) {
        const { currentR, currentC } = q.dequeue();

        for (let i = 0; i < 4; i++) {
          const nextR = currentR + dr[i];
          const nextC = currentC + dc[i];
          if (
            nextR >= 0 &&
            nextR < ROW &&
            nextC >= 0 &&
            nextC < COL &&
            land[nextR][nextC]
          ) {
            q.enqueue({ currentR: nextR, currentC: nextC });
            land[nextR][nextC] = 0;
            oilSize++;
            visitedCol.add(nextC);
          }
        }
      }

      //๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ, ๋ฐฉ๋ฌธํ•œ ์ปฌ๋Ÿผ๋ณ„๋กœ ์„์œ  ๋ฉ์–ด๋ฆฌ ํฌ๊ธฐ oilArr์— ๋”ํ•ด์คŒ
      Array.from(visitedCol).forEach((c) => {
        oilArr[c] += oilSize;
      });
    }
  }

  return Math.max(...oilArr);
}