[PCCP 기출문제] 2번 / 석유 시추

Lv. 2

Solution

export function drillOil(land: number[][]): number {
  const [n, m] = [land.length, land[0].length];
  const directions = [
    [0, 1],
    [0, -1],
    [1, 0],
    [-1, 0],
  ];
  const oilGroup = new Map<number, number>();
 
  function getTotalOil(y: number, x: number, group: number): number {
    let totalOil = 1;
    let queue = [[y, x]];
    land[y][x] = group;
    while (0 < queue.length) {
      const nextQueue = [];
      for (const [cy, cx] of queue) {
        for (const [dy, dx] of directions) {
          const [ny, nx] = [cy + dy, cx + dx];
          if (0 <= ny && ny < n && 0 <= nx && nx < m && land[ny][nx] === 1) {
            land[ny][nx] = group;
            totalOil += 1;
            nextQueue.push([ny, nx]);
          }
        }
      }
      queue = nextQueue;
    }
    return totalOil;
  }
 
  let group = 2;
  for (let x = 0; x < m; x++) {
    for (let y = 0; y < n; y++) {
      if (land[y][x] === 1) {
        oilGroup.set(group, getTotalOil(y, x, group));
        group += 1;
      }
    }
  }
 
  let answer = 0;
  for (let x = 0; x < m; x++) {
    let totalOil = 0;
    const groups = new Set();
    for (let y = 0; y < n; y++) {
      if (1 < land[y][x] && !groups.has(land[y][x])) {
        totalOil += oilGroup.get(land[y][x]) ?? 0;
        groups.add(land[y][x]);
      }
    }
    answer = Math.max(answer, totalOil);
  }
  return answer;
}