๐งฉ ์ด๋ณด์์ฉ ๊ฐ์ด๋ 'Largest Magic Square' โ LeetCode 1895 (C++, Python, JavaScript)
Source: Dev.to
๋ฌธ์ ์ค๋ช
๊ทธ๋ฆฌ๋์์ ํจํด์ ์ฐพ๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ ์ฌ๊ณ ์์ ๊ณ ์ ์ ์ธ ๋์ ๊ณผ์ ์
๋๋ค.
์ด ๋ฌธ์ ์์๋ ๋ชจ๋ ํ, ์ด, ๊ทธ๋ฆฌ๊ณ ๋ ์ฃผ์ ๋๊ฐ์ ์ ํฉ์ด ์ ํํ ๋์ผํ ๊ฐ๋ฅํ ๊ฐ์ฅ ํฐ ๋ถ๋ถ ๊ทธ๋ฆฌ๋๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์
๋๋ค.
์ฃผ์ด์ง ๋ด์ฉ
m ร n์ ์ ๊ทธ๋ฆฌ๋.- ๋งค์ง ์คํ์ด๋ ๋ชจ๋ ํ, ๋ชจ๋ ์ด, ๊ทธ๋ฆฌ๊ณ ๋ ๋๊ฐ์ ์ ํฉ์ด ๊ฐ์
k ร k๋ถ๋ถ ๊ทธ๋ฆฌ๋์ ๋๋ค.
๋ชฉํ
๊ทธ๋ฆฌ๋ ์์ ์จ๊ฒจ์ง ๋งค์ง ์คํ์ด ์ค ์ต๋ ๋ณ์ ๊ธธ์ด k๋ฅผ ๋ฐํํ์ธ์.
์์
์์โฏ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

Input: grid = [[5,1,3,1],
[9,3,3,1],
[1,3,3,8]]
Output: 2
์ ์ฝ ์กฐ๊ฑด
m == grid.lengthn == grid[i].length1 โค m, n โค 501 โค 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
์๋ ๋ฐฉ์ โ ๋จ๊ณ๋ณ
- ์ ๋์ฌ ํ ์ด๋ธ ๊ตฌ์ถ โ O(mยทn) ์๊ฐ, O(mยทn) ์ถ๊ฐ ๊ณต๊ฐ.
- ์ธก๋ฉด ๊ธธ์ด๋ฅผ ํฐ ๊ฒ๋ถํฐ ์์ ๊ฒ์ผ๋ก ์ํ.
- ๊ฐ๋ฅํ ๊ฐ ์ข์๋จ ์ฝ๋์ ๋ํด ์ถ์ถ:
- ์ฃผ ๋๊ฐ์ ํฉ,
- ๋ฐ๋ ๋๊ฐ์ ํฉ,
- ๊ฐ ํ ํฉ,
- ๊ฐ ์ด ํฉ
๋ฅผ ์ ๋์ฌ ํ ์ด๋ธ์ ์์ ์๊ฐ ๋บ์ ๋ง์ผ๋ก ์ํ.
- ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ ์ฒซ ๋ฒ์งธ ํฌ๊ธฐ๊ฐ ๋ต์ด๋ค.
์ฒซ ๋ฒ์งธ ์ ํจํ ํฌ๊ธฐ์์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๋ณต์ก๋๋
O(mยทnยทmin(m, n)) (์ต์
์ ๊ฒฝ์ฐ์๋ m, n โค 50์ด๋ฉด ์ฌ์ ํ ๋น ๋ฆ).