coding test/HackerRank

[HackerRank] Forming a Magic Square

잔망루피 2023. 5. 14. 19:59
반응형

Magic Square를 만드는 규칙이 있다.

8 1 6
3 5 7
4 9 2

위는 3*3의 Magic Square이다.

  1. 1부터 시작한다.
  2. 1의 오른쪽 대각선의 위치에 2를 쓴다. lst[0][1] ➡️ lst[2][2]
    • lst[0][1]의 오른쪽 대각선은 lst[-1][2]이다. lst[-1][2] == lst[2][2]
  3. 2의 오른쪽 대각선의 위치에 3을 쓴다. lst[2][2] ➡️ lst[1][0]
    • lst[2][2]의 오른쪽 대각선은 lst[1][3]인데 lst[1][3%3] == lst[1][0]
  4. 3의 오른쪽 대각선이 이미 숫자가 있어서 아래에 4를 쓴다. lst[1][0] ➡️ lst[2][0]
  5. 위와 같은 과정을 반복

 

 

🤗 나의 풀이

#!/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 

 

Forming a Magic Square | HackerRank

Find the minimum cost of converting a 3 by 3 matrix into a magic square.

www.hackerrank.com

 

반응형

'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