제목:

파이썬으로 구현한 체스판식 2차원 배열 채우기

날짜: Posted on

이 포스트에서는 파이썬으로 체스판식 2차원 배열 채우기 알고리즘을 구현한 예를 소개합니다.

앞서 포스팅한 파이썬으로 구현한 ㄹ자 배열 알고리즘의 예를 응용하여, 이번에는 체스판식으로 채우는 예제를 파이썬으로 구현해 보았습니다.
구현하기에 앞서, 다음과 같이 가상의 과제를 설정하였습니다.

《과제》 코로나19의 확산을 막기 위해 정부는 사회적 거리두기 정책을 시행하고 있다. 이에 어느 한 소극장에서는 정부의 사회적 거리두기 정책에 동참하기 위해 전체 좌석 수의 절반만 받기로 하였다. 이 소극장의 좌석 배열은 가로 8석, 세로 8석으로 총 64석이며, 관객을 전체 좌석 수의 절반인 32석만 받되 관객이 앉은 자리의 양 옆과 앞뒤로 인접한 좌석은 비우려고 한다. 이에 따르기 위한 좌석 배정표를 출력하시오.

《조건》 좌석 번호는 맨 앞줄은 왼쪽부터 1번부터 8번까지, 그 다음 줄은 왼쪽부터 9번부터 16번까지 식이다. 1번 좌석을 비울지 받을지는 선택할 수 있다. 비워둘 좌석은 공백으로 출력한다.

ROW_SIZE = COL_SIZE = 8   # Initialize
arr = [[0 for j in range(COL_SIZE)] for i in range(ROW_SIZE)]
s = 0

for i in range(ROW_SIZE):   # Loop
    for j in range(COL_SIZE):
        s += 1
        arr[i][j] = s

for i in range(ROW_SIZE):   # Print
    print("+----" * COL_SIZE + "+")
    for j in range(COL_SIZE):
        if (i+j) % 2 == 0:  print("|    ", end="")
        else:  print("| %2d " % arr[i][j], end="")
    print("|")
print("+----" * COL_SIZE + "+")

ㄹ자 배열 알고리즘 구현과 거의 비슷합니다. 우선 1번째 줄에서 배열의 크기를 정의하고 2번째 줄에서는 정의된 크기대로 0이 미리 들어가 있는 2차원 배열을 선언합니다. 또, 3번째 줄에서는 1로 시작해서 한 칸씩 이동할 때마다 1씩 커지는 변수를 선언합니다. 0으로 대입한 이유는 배열에 대입하기 전에 값이 1씩 증가하는 것으로 설정했기 때문입니다.

이제 5번 줄에서부터 반복을 시작합니다. 0부터 시작해서 행 수에서 1을 뺀 값까지 반복하는 블록을 만들고 또 6번 줄에서는 0부터 시작해서 열 수에서 1을 뺀 값까지 반복하는 블록을 만듭니다. 이번에는 ㄹ자 배열이 아니므로 역방향 채우기는 넣지 않습니다. 7번 줄에서는 정해진 배열 위치에 대입하기 전에 대입할 숫자를 1씩 증가시킵니다. 처음 선언할 때 0을 대입해 두었기 때문에 첫 번째 차례에서는 1이 됩니다. 그리고 8번 줄에서 1씩 증가시킨 값을 하나씩 대입합니다.

10번째 줄은 반복이 끝난 후 배열에 대입된 값을 출력하기 위해 행 숫자만큼 다시 반복합니다. 11번째 줄에서는 행의 위쪽에 선을 그리고 12번째 줄에서 열 숫자만큼 반복, 13번째 줄과 14번째 줄에서 값을 하나씩 출력합니다. 13번째 줄의 조건문에서 i값(행)과 j값(열)을 더한 값이 짝수이면 공백을 출력, 아니면 14번째 줄로 넘어가서 해당 값을 출력합니다. 15번째 줄에는 행을 끝내는 세로선을 출력하고, 마지막으로 16번째 줄에서는 마지막 가로선을 출력하고 끝냅니다. (선을 출력하는 것은 예쁘게 보이기 위한 것으로, 필수적인 것은 아닙니다.)

이 프로그램의 결과는 다음과 같습니다.

+----+----+----+----+----+----+----+----+
|    |  2 |    |  4 |    |  6 |    |  8 |
+----+----+----+----+----+----+----+----+
|  9 |    | 11 |    | 13 |    | 15 |    |
+----+----+----+----+----+----+----+----+
|    | 18 |    | 20 |    | 22 |    | 24 |
+----+----+----+----+----+----+----+----+
| 25 |    | 27 |    | 29 |    | 31 |    |
+----+----+----+----+----+----+----+----+
|    | 34 |    | 36 |    | 38 |    | 40 |
+----+----+----+----+----+----+----+----+
| 41 |    | 43 |    | 45 |    | 47 |    |
+----+----+----+----+----+----+----+----+
|    | 50 |    | 52 |    | 54 |    | 56 |
+----+----+----+----+----+----+----+----+
| 57 |    | 59 |    | 61 |    | 63 |    |
+----+----+----+----+----+----+----+----+

만약 이 코드의 13번째 줄을 다음과 같이 바꾸면,

if (i+j) % 2 != 0:  print("|    ", end="")

다음과 같이 반대로 출력됩니다.

+----+----+----+----+----+----+----+----+
|  1 |    |  3 |    |  5 |    |  7 |    |
+----+----+----+----+----+----+----+----+
|    | 10 |    | 12 |    | 14 |    | 16 |
+----+----+----+----+----+----+----+----+
| 17 |    | 19 |    | 21 |    | 23 |    |
+----+----+----+----+----+----+----+----+
|    | 26 |    | 28 |    | 30 |    | 32 |
+----+----+----+----+----+----+----+----+
| 33 |    | 35 |    | 37 |    | 39 |    |
+----+----+----+----+----+----+----+----+
|    | 42 |    | 44 |    | 46 |    | 48 |
+----+----+----+----+----+----+----+----+
| 49 |    | 51 |    | 53 |    | 55 |    |
+----+----+----+----+----+----+----+----+
|    | 58 |    | 60 |    | 62 |    | 64 |
+----+----+----+----+----+----+----+----+

만약, 비워둘 자리는 아예 값을 0으로 해 두고 싶다면, 다음과 같이 코딩할 수도 있습니다.

ROW_SIZE = COL_SIZE = 8   # Initialize
arr = [[0 for j in range(COL_SIZE)] for i in range(ROW_SIZE)]
s = 0

for i in range(ROW_SIZE):   # Loop
    for j in range(COL_SIZE):
        s += 1
        if (i+j) % 2 == 0: arr[i][j] = s  # (i+j) % 2 != 0 으로 해도 무방

for i in range(ROW_SIZE):   # Print
    print("+----" * COL_SIZE + "+")
    for j in range(COL_SIZE):
        if arr[i][j] == 0:  print("|    ", end="")
        else:  print("| %2d " % arr[i][j], end="")
    print("|")
print("+----" * COL_SIZE + "+")

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다