코딩 테스트 및 알고리즘/leetcode for google

leetcode medium : Magic Squares In Grid

띠리링구 2023. 1. 15. 01:43

https://leetcode.com/problems/magic-squares-in-grid/description/

 

Magic Squares In Grid - LeetCode

Magic Squares In Grid - A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum. Given a row x col grid of integers, how many 3 x 3 "magic square" subgrids are the

leetcode.com

 

풀기 전에

뭔가 쉬워보이는데.. 꿍꿍이가 있는 문제일까?

특별히 뭔가 최적화할건 없는거같다.

초보자라면 sum 구해서 비교하는건 쉬워도 1~9 distinct 조건이 좀 어려울수도 있긴한데

이건 set에다 넣어서 길이 9인지 확인하고 min 값이랑 max값이 각각 1,9인지만 보면 된다.

 

class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        if len(grid) < 3 or len(grid[0]) < 3: return 0

        answer = 0

        for i in range(len(grid) - 2):
            for j in range(len(grid[0]) - 2):
                minnum = 16
                maxnum = -1
                dset = set()
                for k in range(3):
                    for l in range(3):
                        dset.add(grid[i+k][j+l])
                        minnum = min(minnum, grid[i+k][j+l])
                        maxnum = max(maxnum, grid[i+k][j+l])
                if minnum != 1 or maxnum != 9 or len(dset) != 9:
                    continue
                r = [sum(grid[i+y][j+x] for x in range(3)) for y in range(3)]
                c = [sum(grid[i+y][j+x] for y in range(3)) for x in range(3)]
                d1 = sum(grid[i+x][j+x] for x in range(3))
                d2 = sum(grid[i+2-x][j+x] for x in range(3))

                if r[0] == r[1] == r[2] == c[0] == c[1] == c[2] == d1 == d2:
                    answer += 1

        return answer

복잡도는 row길이 * col 길이에 비례하는듯하다.