๐Ÿงฉ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ 'Largest Magic Square' โ€“ LeetCode 1895 (C++, Python, JavaScript)

๋ฐœํ–‰: (2026๋…„ 1์›” 18์ผ ์˜คํ›„ 12:37 GMT+9)
7 min read
์›๋ฌธ: Dev.to

Source: Dev.to

๋ฌธ์ œ ์„ค๋ช…

๊ทธ๋ฆฌ๋“œ์—์„œ ํŒจํ„ด์„ ์ฐพ๋Š” ๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ๊ณ ์—์„œ ๊ณ ์ „์ ์ธ ๋„์ „ ๊ณผ์ œ์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์—์„œ๋Š” ๋ชจ๋“  ํ–‰, ์—ด, ๊ทธ๋ฆฌ๊ณ  ๋‘ ์ฃผ์š” ๋Œ€๊ฐ์„ ์˜ ํ•ฉ์ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๋ถ€๋ถ„ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋‚ด์šฉ

  • m ร— n ์ •์ˆ˜ ๊ทธ๋ฆฌ๋“œ.
  • ๋งค์ง ์Šคํ€˜์–ด๋Š” ๋ชจ๋“  ํ–‰, ๋ชจ๋“  ์—ด, ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋Œ€๊ฐ์„ ์˜ ํ•ฉ์ด ๊ฐ™์€ k ร— k ๋ถ€๋ถ„ ๊ทธ๋ฆฌ๋“œ์ž…๋‹ˆ๋‹ค.

๋ชฉํ‘œ

๊ทธ๋ฆฌ๋“œ ์•ˆ์— ์ˆจ๊ฒจ์ง„ ๋งค์ง ์Šคํ€˜์–ด ์ค‘ ์ตœ๋Œ€ ๋ณ€์˜ ๊ธธ์ด k๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

์˜ˆ์‹œ

์˜ˆ์‹œโ€ฏ1

์˜ˆ์‹œโ€ฏ1

Input:  grid = [[7,1,4,5,6],
               [2,5,1,6,4],
               [1,5,4,3,2],
               [1,2,7,3,4]]
Output: 3

์„ค๋ช… โ€“ ๊ฐ€์žฅ ํฐ ๋งˆ๋ฒ• ์ •์‚ฌ๊ฐํ˜•์˜ ํฌ๊ธฐ๋Š”โ€ฏ3์ž…๋‹ˆ๋‹ค. ์ด ์ •์‚ฌ๊ฐํ˜•์˜ ๋ชจ๋“  ํ–‰ ํ•ฉ, ์—ด ํ•ฉ, ๋Œ€๊ฐ์„  ํ•ฉ์€ ๋ชจ๋‘โ€ฏ12๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • ํ–‰ ํ•ฉ: 5+1+6 = 5+4+3 = 2+7+3 = 12
  • ์—ด ํ•ฉ: 5+5+2 = 1+4+7 = 6+3+3 = 12
  • ๋Œ€๊ฐ์„  ํ•ฉ: 5+4+3 = 6+4+2 = 12

์˜ˆ์‹œโ€ฏ2

์˜ˆ์‹œโ€ฏ2

Input:  grid = [[5,1,3,1],
               [9,3,3,1],
               [1,3,3,8]]
Output: 2

์ œ์•ฝ ์กฐ๊ฑด

  • m == grid.length
  • n == grid[i].length
  • 1 โ‰ค m, n โ‰ค 50
  • 1 โ‰ค grid[i][j] โ‰ค 10โถ

์ง๊ด€

๋ธŒ๋ฃจํŠธโ€‘ํฌ์Šค ํ•ด๊ฒฐ์ฑ…์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ์˜ ๋ชจ๋“  ์ •์‚ฌ๊ฐํ˜•์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ–‰, ์—ด, ๋Œ€๊ฐ์„ ์˜ ํ•ฉ์„ ์ˆ˜๋™์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ ‘๋‘ํ•ฉ(๋ˆ„์  ํ•ฉ๊ณ„)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์—ดโ€ฏ10๊นŒ์ง€์™€ ์—ดโ€ฏ5๊นŒ์ง€์˜ ํ–‰ ํ•ฉ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, 5์™€ 10 ์‚ฌ์ด์˜ ํ•ฉ์€ ๋‘ ๊ฐ’์˜ ์ฐจ์ด๋งŒํผ์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์…€์— ๋Œ€ํ•ด ๋„ค ๊ฐœ์˜ ์ ‘๋‘ํ•ฉ ํ‘œ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค:

์œ ํ˜•์˜๋ฏธ
์ˆ˜ํ‰ํ˜„์žฌ ํ–‰์—์„œ ์ด ์…€๊นŒ์ง€์˜ ์š”์†Œ ํ•ฉ
์ˆ˜์งํ˜„์žฌ ์—ด์—์„œ ์ด ์…€๊นŒ์ง€์˜ ์š”์†Œ ํ•ฉ
์ฃผ ๋Œ€๊ฐ์„ ์™ผ์ชฝ ์œ„ โ†’ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋Œ€๊ฐ์„ ์„ ๋”ฐ๋ผ ์ด ์…€๊นŒ์ง€์˜ ํ•ฉ
๋ฐ˜๋Œ€ ๋Œ€๊ฐ์„ ์˜ค๋ฅธ์ชฝ ์œ„ โ†’ ์™ผ์ชฝ ์•„๋ž˜ ๋Œ€๊ฐ์„ ์„ ๋”ฐ๋ผ ์ด ์…€๊นŒ์ง€์˜ ํ•ฉ

์ด ํ‘œ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด k ร— k ์ •์‚ฌ๊ฐํ˜•์ด ๋งˆ๋ฒ• ์ •์‚ฌ๊ฐํ˜•์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์ด ๋ช‡ ๋ฒˆ์˜ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋บ„์…ˆ์œผ๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ ๋ณ€์˜ ๊ธธ์ด min(m, n)๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค; ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํฌ๊ธฐ๊ฐ€ ๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜ ์ฝ”๋“œ

C++

class Solution {
public:
    // Check whether the kร—k square with topโ€‘left corner (r, c) is magic
    bool isMagic(const vector>>& pref,
                 int r, int c, int k) {
        // target sum = main diagonal of the square
        int target = pref[r + k][c + k][2] - pref[r][c][2];

        // antiโ€‘diagonal must match
        if (target != pref[r + k][c + 1][3] - pref[r][c + k + 1][3])
            return false;

        // each row sum must match
        for (int i = r; i >& grid) {
        int m = grid.size(), n = grid[0].size();

        // pref[i][j] = {row, col, diag, antiโ€‘diag} sums up to (iโ€‘1, jโ€‘1)
        vector>> pref(m + 1,
                                          vector>(n + 2, {0,0,0,0}));

        for (int i = 1; i = 2; --k) {
            for (int i = 0; i + k  int:
        m, n = len(grid), len(grid[0])

        # pref[i][j] = [row, col, diag, anti_diag] sums up to (iโ€‘1, jโ€‘1)
        # extra padding (n+2) simplifies antiโ€‘diagonal indexing
        pref = [[[0] * 4 for _ in range(n + 2)] for _ in range(m + 1)]

        for i in range(1, m + 1):
            for j in range(1, n + 1):
                val = grid[i - 1][j - 1]
                pref[i][j][0] = pref[i][j - 1][0] + val          # row
                pref[i][j][1] = pref[i - 1][j][1] + val          # column
                pref[i][j][2] = pref[i - 1][j - 1][2] + val      # main diagonal
                pref[i][j][3] = pref[i - 1][j + 1][3] + val      # antiโ€‘diagonal

        # helper to test a kร—k square with topโ€‘left corner (r, c)
        def is_magic(r: int, c: int, k: int) -> bool:
            target = pref[r + k][c + k][2] - pref[r][c][2]      # main diagonal
            if target != pref[r + k][c + 1][3] - pref[r][c + k + 1][3]:
                return False

            # rows
            for i in range(r, r + k):
                if pref[i + 1][c + k][0] - pref[i + 1][c][0] != target:
                    return False
            # columns
            for j in range(c, c + k):
                if pref[r + k][j + 1][1] - pref[r][j + 1][1] != target:
                    return False
            return True

        for k in range(min(m, n), 1, -1):
            for i in range(m - k + 1):
                for j in range(n - k + 1):
                    if is_magic(i, j, k):
                        return k
        return 1

Python

3] + val

def is_magic(r, c, k):
    # Target sum from the main diagonal
    target = pref[r + k][c + k][2] - pref[r][c][2]

    # Check anti-diagonal
    if target != pref[r + k][c + 1][3] - pref[r][c + k + 1][3]:
        return False

    # Check all rows
    for i in range(r, r + k):
        if pref[i + 1][c + k][0] - pref[i + 1][c][0] != target:
            return False

    # Check all columns
    for j in range(c, c + k):
        if pref[r + k][j + 1][1] - pref[r][j + 1][1] != target:
            return False

    return True

# Check from largest possible side length downwards
for k in range(min(m, n), 1, -1):
    for i in range(m - k + 1):
        for j in range(n - k + 1):
            if is_magic(i, j, k):
                return k
return 1

JavaScript

/**
 * @param {number[][]} grid
 * @return {number}
 */
var largestMagicSquare = function (grid) {
    const m = grid.length;
    const n = grid[0].length;

    // Create prefix

์ž‘๋™ ๋ฐฉ์‹ โ€“ ๋‹จ๊ณ„๋ณ„

  1. ์ ‘๋‘์‚ฌ ํ…Œ์ด๋ธ” ๊ตฌ์ถ• โ€“ O(mยทn) ์‹œ๊ฐ„, O(mยทn) ์ถ”๊ฐ€ ๊ณต๊ฐ„.
  2. ์ธก๋ฉด ๊ธธ์ด๋ฅผ ํฐ ๊ฒƒ๋ถ€ํ„ฐ ์ž‘์€ ๊ฒƒ์œผ๋กœ ์ˆœํšŒ.
  3. ๊ฐ€๋Šฅํ•œ ๊ฐ ์ขŒ์ƒ๋‹จ ์ฝ”๋„ˆ์— ๋Œ€ํ•ด ์ถ”์ถœ:
    • ์ฃผ ๋Œ€๊ฐ์„  ํ•ฉ,
    • ๋ฐ˜๋Œ€ ๋Œ€๊ฐ์„  ํ•ฉ,
    • ๊ฐ ํ–‰ ํ•ฉ,
    • ๊ฐ ์—ด ํ•ฉ
      ๋ฅผ ์ ‘๋‘์‚ฌ ํ…Œ์ด๋ธ”์˜ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋บ„์…ˆ๋งŒ์œผ๋กœ ์ˆ˜ํ–‰.
  4. ๋ชจ๋“  ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํฌ๊ธฐ๊ฐ€ ๋‹ต์ด๋‹ค.

์ฒซ ๋ฒˆ์งธ ์œ ํšจํ•œ ํฌ๊ธฐ์—์„œ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋ณต์žก๋„๋Š”
O(mยทnยทmin(m, n)) (์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ m, n โ‰ค 50์ด๋ฉด ์—ฌ์ „ํžˆ ๋น ๋ฆ„).

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐Ÿงฑ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ โ€˜๊ทธ๋ฆฌ๋“œ์—์„œ ์ •์‚ฌ๊ฐํ˜• ๊ตฌ๋ฉ์˜ ๋ฉด์  ์ตœ๋Œ€ํ™”โ€™ โ€“ LeetCode 2943 (C++, Python, JavaScript)

Problem Overview ๋‹น์‹ ์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ฒƒ์€: - ๊ฒฉ์ž(grid) ๋‚ด์˜ ๋‚ด๋ถ€ ์ˆ˜ํ‰ ๋ฐ ์ˆ˜์ง ๋ง‰๋Œ€์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ n๊ณผ m. - ๋‘ ๋ฐฐ์—ด arrays, hBars์™€ vBars, listingโ€ฆ