본문 바로가기

알고리즘/해커랭크

[Hacker Rank] Magic Squre

728x90

해당 문제는 n이 3인 완전 탐색문제로 모든 경우의 수를 순열로 구한뒤, 가로, 세로, 대각선의 합이 일치하는지 확인후 일치한다면 이전 그래프와 차이점을 계산하여 최소값을 구하면 된다.

import sys
input = sys.stdin.readline
s = []

for _ in range(3):
    s.append(list(map(int, input().split())))

def check(s):
    colsum = s[0][0] + s[1][0] + s[2][0]
    rowsum = sum(s[0])
    cross1 = s[0][0] + s[1][1] + s[2][2]
    cross2 = s[0][2] + s[1][1] + s[2][0]

    for i in range(3): # check raw and col
        if i != 0:
            if colsum != (s[0][i] + s[1][i] + s[2][i]):
                return False
            if rowsum != sum(s[i]):
                return False

    if cross1 == cross2:
        return True
    else:
        return False

def calculate(s1, s2):
    temp = 0
    for i in range(3):
        for j in range(3):
            temp += abs(s1[i][j] - s2[i][j])

    return temp

ans = 90
def dfs(number):
    global ans
    if len(number) == 9:
        s2 = []
        s2.append(number[:3])
        s2.append(number[3:6])
        s2.append(number[6:9])
        if check(s2):
            ans = min(calculate(s, s2), ans)
        return

    for num in range(1, 10):
        if num not in number:
            number.append(num)
            dfs(number)
            number.pop()

dfs([])
print(ans)
728x90

'알고리즘 > 해커랭크' 카테고리의 다른 글

[HackerRank] Climbing the Leaderboard  (0) 2023.10.20