Magic Square를 만드는 규칙이 있다.
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
위는 3*3의 Magic Square이다.
- 1부터 시작한다.
- 1의 오른쪽 대각선의 위치에 2를 쓴다. lst[0][1] ➡️ lst[2][2]
- lst[0][1]의 오른쪽 대각선은 lst[-1][2]이다. lst[-1][2] == lst[2][2]
- 2의 오른쪽 대각선의 위치에 3을 쓴다. lst[2][2] ➡️ lst[1][0]
- lst[2][2]의 오른쪽 대각선은 lst[1][3]인데 lst[1][3%3] == lst[1][0]
- 3의 오른쪽 대각선이 이미 숫자가 있어서 아래에 4를 쓴다. lst[1][0] ➡️ lst[2][0]
- 위와 같은 과정을 반복
🤗 나의 풀이
#!/bin/python3
import math
import os
import random
import re
import sys
#
# Complete the 'formingMagicSquare' function below.
#
# The function is expected to return an INTEGER.
# The function accepts 2D_INTEGER_ARRAY s as parameter.
#
def formingMagicSquare(s):
# Write your code here
result = 72
magics = [[8, 3, 4, 1, 5, 9, 6, 7, 2],
[6, 1, 8, 7, 5, 3, 2, 9, 4],
[2, 7, 6, 9, 5, 1, 4, 3, 8],
[2, 9, 4, 7, 5, 3, 6, 1, 8],
[4, 3, 8, 9, 5, 1, 2, 7, 6],
[8, 1, 6, 3, 5, 7, 4, 9, 2],
[6, 7, 2, 1, 5, 9, 8, 3, 4],
[4, 9, 2, 3, 5, 7, 8, 1, 6]]
arr_s = [s[i][j] for i in range(3) for j in range(3)]
for magic in magics :
total = 0
for a, b in zip(magic, arr_s) :
total += abs(a - b)
result = min(result, total)
return result
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
s = []
for _ in range(3):
s.append(list(map(int, input().rstrip().split())))
result = formingMagicSquare(s)
fptr.write(str(result) + '\n')
fptr.close()
입력으로 주어지는 s는 3*3의 크기로 정해져있다.
회전, 좌우 반전을 하면 8가지가 나온다. 나는 직접 입력했다.
아니면 하나만 구하고 회전/반전을 통해 얻도록 구현할 수도 있다.
8가지의 Magic Square와 비교하면서 최소값을 찾는다.
#!/bin/python3
import math
import os
import random
import re
import sys
#
# Complete the 'formingMagicSquare' function below.
#
# The function is expected to return an INTEGER.
# The function accepts 2D_INTEGER_ARRAY s as parameter.
#
def rotate(arr) :
result = []
for y in range(3) :
for x in range(2, -1, -1) :
result.append(arr[(3 * x) + y])
return result
def reversal(arr) :
result = []
for x in range(3) :
for y in range(3) :
result.append(arr[3 * x + (2 - y)])
return result
def formingMagicSquare(s):
# Write your code here
result = 72
magics = [[8, 3, 4, 1, 5, 9, 6, 7, 2]]
for i in range(3) :
magics.append(rotate(magics[-1]))
for i in range(4) :
magics.append(reversal(magics[i]))
arr_s = [s[i][j] for i in range(3) for j in range(3)]
for magic in magics :
total = 0
for a, b in zip(magic, arr_s) :
total += abs(a - b)
result = min(result, total)
return result
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
s = []
for _ in range(3):
s.append(list(map(int, input().rstrip().split())))
result = formingMagicSquare(s)
fptr.write(str(result) + '\n')
fptr.close()
회전, 반전까지 구했다.
문제 출처 .👇👇
https://www.hackerrank.com/challenges/magic-square-forming/problem?isFullScreen=true
반응형
'coding test > HackerRank' 카테고리의 다른 글
[HackerRank] Matrix Layer Rotation (1) | 2023.05.18 |
---|---|
[HackerRank] Queen's Attack 2 (0) | 2023.05.17 |
[HackerRank] Non-Divisible Subset (0) | 2023.05.16 |
[HackerRank] Climbing the Leaderboard (0) | 2023.05.15 |
[HackerRank] Extra Long Factorials (0) | 2023.05.15 |