먼저 문제에 대한 링크이다.
https://www.acmicpc.net/problem/1307
문제와의 첫만남
말그대로 마방진을 구현하는 심플(?..ㅎㅎ)한 문제이다.
maximum값 은 300으로 n의 제곱 크기의 마방진을 구현해야 하므로, 시간복잡도 nlogn안에 해결해야 할 것 같다
내가 알고있는 기초지식은 문제에서 설명해준 것처럼,
N*N의 격자의 각 칸에 1부터 N*N까지의 정수를 정확히 하나씩 채웠을 때, 모든 가로줄, 세로줄, 대각선의 합이 같은 배치를 말한다.-문제 본문중-
이 정도가 아는 전부였다.
그래서 마방진을 만드는 방법을 알아보기 위해 검색을 시도했다.
마방진 만드는 법으로 검색했는데, 홀수 마방진과 n = 4의 경우는 쉽게 찾을 수 있었으나, 그 이상은 일반 블로그 내용에서는 찾을 수 없었다.
다음 논문에서 모든n에서의 마방진 알고리즘을 찾을 수 있었다. http://koreascience.or.kr/article/JAKO201720861241284.page
내가 오늘 할수 있는 부분은 이정도 까지인 것 같다. 내일 다시 시도 해 봐야겠다.
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 |