[codeup] 1510 : 홀수 마방진

SUNGJIN KIM·2022년 1월 9일
0

CODEUP

목록 보기
15/76
post-thumbnail

문제

마방진(magic square)이란 가로, 세로, 대각선의 합이 같은 사각형을 말한다.

홀수 n을 입력으로 받아 n*n 홀수 마방진을 만들어 보자.

만드는 방법은 여러가지 방법이 있지만, 아래와 같은 방법을 이용하여 구현해보자.

구현 방법:

  1. 시작은 첫 행, 한 가운데 열에 1을 둔다.

  2. 행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.

  3. 행은 감소하므로 첫 행보다 작아지는 경우에는 마지막 행으로 넘어간다.

  4. 열은 증가하므로 마지막 열보다 커지는 경우에는 첫 열로 넘어간다.

  5. 넣은 수가 n의 배수이면 행만 증가한다. 열은 변화없음.

입력

마방진의 크기인 n이 입력된다.(n은 50보다 작은 홀수인 자연수)

입력 예시

3

출력

위의 방법대로 크기가 n인 홀수 마방진을 출력한다.

출력 예시

8 1 6
3 5 7
4 9 2

문제 풀이

풀이 방법은 아래와 같다.
일단 마방진에 대한 이해가 필요하여 예시를 바탕으로 그대로 손으로 직접 규칙에 따라 진행해보았다.

이렇게 직접 진행해보았다면 이젠 규칙을 정리해보면 된다.

  1. 시작의 첫 행, 한 가운데는 "1"이 들어가야 한다.
  • 3인 경우의 인덱스는 0,1,2 기 때문에 1에 "1"값이 들어가야 한다.
  • 5인 경우의 인덱스는 0,1,2,3,4 기 때문에 2에 "1"값이 들어가야 한다.
  • 7인 경우의 인덱스는 0,1,2,3,4,5,6 이기 때문에, 3에 "1"값이 들어가야 한다.

이를 바탕으로 첫 행의 1이 들어가야 할 열은 "n/2"

  1. 배열에 넣은 수가 n의 배수인 경우와 n의 배수가 아닌 경우에 따라 열과 행값을 구한다.
  • n의 배수인 경우 : 행만 1 증가 ( 행 + 1 )
    n의 배수가 아닌 경우 : 행 1 감소, 열 1 증가 ( 행 - 1, 열 + 1)
  1. 배열 내 들어가야 하는 수의 범위는 1 ~ (n*n) 값이다.

이 규칙을 먼저 세우고 진행 시, 큰 어려움 없이 문제를 풀 수 있었다.
소요시간은 한 30분도 안된 것 같다. 처음에는 굉장히 어렵게 느껴졌는데, 이렇게 정리하면서 푸니까 금방 푼 것 같다.

처음에 아예 배열을 지정을 해줄지 말지 고민을 많이 했는데,
배열을 임시로 지정하는게 조금 더 편할 것 같아서 이와 같이 진행하였다.

array_list = [[0 for col in range(array_size)] for row in range(array_size)]

제출 코드

array_size = int(input())
array_list = [[0 for col in range(array_size)] for row in range(array_size)]

def check_index(index):
   if index < 0:
      index = array_size-1
   elif index > array_size-1:
      index = 0

   return index

index_num = 1
f_num = int(array_size/2)
# 현재 행과 열의 index 주소를 저장
col,row = 0, f_num

# 첫번째 규칙 : 배열을 만든 후, 해당 열의 가운데는 1을 넣어야 한다.
array_list[col][row] = index_num
index_num += 1

# 두번째 규칙 : 현재 array_list의 수가 array_size의 배수인 경우와 배수가 아닌 경우
while index_num != (array_size*array_size)+1:
   if array_list[col][row] % array_size != 0:
      col = check_index(col-1)
      row = check_index(row+1)
      array_list[col][row] = index_num
      index_num += 1
   elif array_list[col][row] % array_size == 0:
      col = check_index(col+1)
      array_list[col][row] = index_num
      index_num += 1

# 출력 예시와 같이 출력
for i in range(len(array_list)):            
    for j in range(len(array_list[i])):     
        print(array_list[i][j], end=' ')
    print()

조금 더 간단하게 풀 수 있는 방법도 있을 것 같은데, 이 부분은 조금 더 고민해볼 필요가 있을 것 같다.

오랜만에 푼 것 치고는 그래도 많이 안까먹어서 다행이라고 생각한다....

profile
#QA #woonmong

0개의 댓글