λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 221 - Maximal Square (Medium)

by HandHand 2021. 3. 2.

문제

LeetCode - 221번

풀이 κ³Όμ •

주어진 martix μ•ˆμ—μ„œ κ°€μž₯ 큰 μ •μ‚¬κ°ν˜•μ„ μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
각각의 μ •μ‚¬κ°ν˜•μ€ λ˜λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λŠ” 점을 톡해 동적 κ³„νšλ²• 으둜 풀이가 κ°€λŠ₯ν•œ λ¬Έμ œμž…λ‹ˆλ‹€.

λ”°λΌμ„œ dp(x, y) = (x, y)λ₯Ό μ™Όμͺ½ λͺ¨μ„œλ¦¬λ‘œ ν•˜λŠ” μ΅œλŒ€ μ •μ‚¬κ°ν˜•μ˜ ν•œ λ³€μ˜ 길이 라고 μ •μ˜ν•œλ‹€λ©΄
λ‹€μŒκ³Ό 같은 점화식을 μ„ΈμšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

dp(x,y) = 0 if board[x][y] == 0 else min(dp(x+1, y), dp(x+1, y+1), dp(x, y+1)) + 1


μ΄λ•Œ board 의 각 지점을 μˆœνšŒν•˜λ©° 1이 λ°œκ²¬λ λ•Œλ§ˆλ‹€ dp λ₯Ό ν˜ΈμΆœν•˜λ©° μ΅œλŒ€κ°’μ„ κ°±μ‹ ν•˜λ©΄ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ

/**
 * @param {character[][]} matrix
 * @return {number}
 */
var maximalSquare = function (matrix) {
  if (matrix.length === 0) {
    return 0;
  }
  const H = matrix.length;
  const W = matrix[0].length;

  const memo = new Array(H).fill(null).map((_) => new Array(W).fill(-1));

  function dp(x, y) {
    if (x < 0 || x >= H || y < 0 || y >= W) {
      return 0;
    }

    if (memo[x][y] !== -1) {
      return memo[x][y];
    }

    if (matrix[x][y] === "1") {
      memo[x][y] = Math.min(dp(x + 1, y), dp(x + 1, y + 1), dp(x, y + 1)) + 1;
    } else {
      memo[x][y] = 0;
    }

    return memo[x][y];
  }

  // κ°€μž₯ 큰 μ •μ‚¬κ°ν˜•μ„ μ°ΎλŠ”λ‹€.
  let ans = 0;
  for (let x = 0; x < H; x++) {
    for (let y = 0; y < W; y++) {
      if (matrix[x][y] === "1") {
        ans = Math.max(ans, dp(x, y));
      }
    }
  }

  return ans * ans;
};

const matrix = [
  ["1", "1", "1", "1", "1"],
  ["1", "0", "1", "1", "1"],
  ["1", "1", "1", "1", "1"],
  ["1", "0", "0", "1", "0"],
];
console.log(maximalSquare(matrix));
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€