본문 바로가기
파이썬/파이썬 백준

1307:마방진 풀기 1일차.

by soypablo 2022. 6. 13.

먼저 문제에 대한 링크이다.

https://www.acmicpc.net/problem/1307

 

1307번: 마방진

마방진이란 N*N의 격자의 각 칸에 1부터 N*N까지의 정수를 정확히 하나씩 채웠을 때, 모든 가로줄, 세로줄, 대각선의 합이 같은 배치를 말한다. 예를 들면, 다음은 3*3 마방진 중 하나이다. 가로줄,

www.acmicpc.net

문제와의 첫만남
말그대로 마방진을 구현하는 심플(?..ㅎㅎ)한 문제이다.
maximum값 은 300으로 n의 제곱 크기의 마방진을 구현해야 하므로, 시간복잡도 nlogn안에 해결해야 할 것 같다
내가 알고있는 기초지식은 문제에서 설명해준 것처럼,
N*N의 격자의 각 칸에 1부터 N*N까지의 정수를 정확히 하나씩 채웠을 때, 모든 가로줄, 세로줄, 대각선의 합이 같은 배치를 말한다.-문제 본문중-

이 정도가 아는 전부였다.

그래서 마방진을 만드는 방법을 알아보기 위해 검색을 시도했다.
마방진 만드는 법으로 검색했는데, 홀수 마방진과 n = 4의 경우는 쉽게 찾을 수 있었으나, 그 이상은 일반 블로그 내용에서는 찾을 수 없었다.
다음 논문에서 모든n에서의 마방진 알고리즘을 찾을 수 있었다. http://koreascience.or.kr/article/JAKO201720861241284.page

 

The Magic Square Algorithm -The Journal of the Institute of Internet, Broadcasting and Communication | Korea Scienc

Abstract This paper proposes an algorithm for odd, doubly even, and singly even magic squares. In constructing an odd magic square, de la $Loub{\grave{e}}re^{\prime}s$ method is widely known and used, but it has an inherent defect of executing $O(n^2)$ ste

koreascience.or.kr

내가 오늘 할수 있는 부분은 이정도 까지인 것 같다. 내일 다시 시도 해 봐야겠다.

def make_odd_magicsquare(n:int) -> list[list]:
    def fill_num(x, y, d, direction, pivot_value):
        nonlocal arr
        directions = [(-1, -1), (-1, 1), (1, -1), (1, 1)]
        now_direction = directions[direction]
        for i in 
    
    arr = [[0 for _ in range(n)] for _ in range(n)]
    #가운데에 median값을 넣는다.
    x, y = n // 2, n // 2
    arr[y][x] = (n ** 2 + 1) // 2
    #가운데 중심으로 \방향 대각선의 값을 채운다.
    for ind in range(1, n // 2):
        arr[y - ind][x - ind] = arr[y][x] - ind
        arr[y + ind][x + ind] = arr[y][x] + ind
        #체크무늬만큼 채운다.
        num_match(y - ind, x - ind, ind)
        num_match(y + ind, x + ind, ind)
    #median 위아래로 N^2, 1을 채운다.
    arr[y - 1][x] = n ** 2
    arr[y + 1][x] = 1
    #나머지를 채운다.
    


def make_even_magicsquare(x:int) -> list[list]:
    pass


if __name__ == '__main__':
    N = int(input())
    #N이 홀수 일 때.
    if N % 2 == 1:
        square = make_odd_magicsquare(N)
    #짝수일때.
    else:
        square = make_even_magicsquare(N)
    for i in square:
        print(" ".join(i))

 

'파이썬 > 파이썬 백준' 카테고리의 다른 글

[파이썬]10997:별 찍기 - 22  (0) 2023.05.22
백준 1307:마방진 코드수정  (0) 2022.06.19
1307:마방진 풀기 3, 4일차  (0) 2022.06.16
마방진:1307 2일차.  (0) 2022.06.14