파이썬으로 구현한 달팽이집 배열 알고리즘의 예

이 포스트에서는 파이썬으로 달팽이집 배열 알고리즘을 구현한 예를 소개합니다.

개정되기 전의 정보처리기사 실기 문제 중에 2차원 배열에 숫자를 달팽이집 형태로 1씩 증가시켜서 넣는 알고리즘을 구현하는 문제가 있었습니다. 여기서는 이 알고리즘을 구현해 보았습니다. 코드는 다음과 같습니다.
※주: 정보처리기사 시험은 2020년부터 NCS 기반으로 개정됨에 따라 기존의 알고리즘 구현 문제는 폐지되고 프로그래밍 언어 활용으로 대체되어 순서도 빈칸 채우기 문제는 출제되지 않습니다.

ARRAY_SIZE = 8   # Initialize
arr = [[0 for j in range(ARRAY_SIZE)] for i in range(ARRAY_SIZE)]
s = 0; y = 0; x = -1; rp = ARRAY_SIZE; sw = 1

while rp > 0:   # Loop
    for i in range(rp):
        x += sw; s += 1
        arr[y][x] = s
    rp -= 1
    for i in range(rp):
        y += sw; s += 1
        arr[y][x] = s
    sw *= -1

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

여기서는 체스판 위에 숫자를 달팽이집 모양으로 적는 상황을 가정하고 8×8 배열로 설정하였으며, 배열 번호는 0부터 시작합니다.

파이썬으로 구현한 ㄹ자 배열 알고리즘의 예와 비슷합니다. 여기서는 2차원 배열이 정사각형이라고 가정하고 행 수와 열 수를 한 변수에 통합했습니다. 1번째 줄에서 그 크기를 정의, 2번째 줄에서는 그 크기대로 0이 초기값인 2차원 배열을 선언합니다. 3번째 줄에서는 여러 변수를 선언하는데, 한 칸씩 이동할 때마다 1씩 커지는 변수와 대입 위치를 정하는 변수, 이동을 위한 반복 횟수를 지정하는 변수와 이동 방향 변수(1은 정방향, -1은 역방향)입니다. x값을 -1로 선언하는 이유는 대입 전에 위치를 옮기기 때문에 [0][0] 위치에서 시작할 수 있도록 처음 x값을 0이 아닌 -1로 선언하는 것입니다.

이제 5번 줄에서 반복이 시작됩니다. 이동 반복 횟수(rp)가 0보다 클 동안 반복하는 것입니다. 먼저(6-8번줄 반복) 가로로 움직이는데, 처음 반복할 횟수는 배열 사이즈와 같습니다. x를 한 칸씩 이동하고(처음에 -1이었으니 0부터 시작) 대입할 값에 1씩 더합니다. 그리고 그 값을 배열의 해당 위치에 대입합니다.
반복이 끝난 뒤 9번 줄을 보면 반복 횟수를 하나씩 줄이는데, 그 이유는 아래와 같습니다. 5×5 배열에 숫자를 같은 방법으로 적되 가로/세로 방향이 바뀌면 색이 달라지게 해서 적어 보면,

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

위와 같이 가로에서 세로로 방향이 전환될 때 색깔이 같은 숫자의 반복 휫수가 하나씩 줄어드는 것을 볼 수 있습니다. 이를 반영하여, 가로 반복이 끝난 뒤에 반복 횟수를 하나씩 줄이는 것입니다.
세로 방향 반복(10-12번 줄)도 가로 방향 반복과 방법이 같습니다. 그리고 세로 방향 반복도 끝나면 13번 줄에서 정방향/역방향 여부를 바꿉니다.
이렇게 가로/세로와 정방향/역방향 여부를 서로 바꿔가면서 반복하다 보면 가운데로 갈 때 반복 횟수가 0이 되고 반복에서 빠져나옵니다.

15번째 줄은 반복이 끝난 후 배열에 대입된 값을 출력하기 위해 행 숫자만큼 다시 반복합니다. 16번째 줄에서는 행의 위쪽에 선을 그리고 17번째 줄에서 열 숫자만큼 반복, 18번째 줄에서 값을 하나씩 출력합니다. 19번째 줄에는 행을 끝내는 세로선을 출력하고, 마지막으로 20번째 줄에서는 마지막 가로선을 출력하고 끝냅니다. (선을 출력하는 것은 예쁘게 보이기 위한 것으로, 필수적인 것은 아닙니다.)

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

+----+----+----+----+----+----+----+----+
|  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |
+----+----+----+----+----+----+----+----+
| 28 | 29 | 30 | 31 | 32 | 33 | 34 |  9 |
+----+----+----+----+----+----+----+----+
| 27 | 48 | 49 | 50 | 51 | 52 | 35 | 10 |
+----+----+----+----+----+----+----+----+
| 26 | 47 | 60 | 61 | 62 | 53 | 36 | 11 |
+----+----+----+----+----+----+----+----+
| 25 | 46 | 59 | 64 | 63 | 54 | 37 | 12 |
+----+----+----+----+----+----+----+----+
| 24 | 45 | 58 | 57 | 56 | 55 | 38 | 13 |
+----+----+----+----+----+----+----+----+
| 23 | 44 | 43 | 42 | 41 | 40 | 39 | 14 |
+----+----+----+----+----+----+----+----+
| 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 |
+----+----+----+----+----+----+----+----+

답글 남기기

이메일 주소는 공개되지 않습니다.