이 포스트에서는 파이썬으로 ㄹ자 배열 알고리즘을 구현한 예를 소개합니다.
개정되기 전의 정보처리기사 실기 문제 중에 2차원 배열에 숫자를 ㄹ자로 넣는 알고리즘을 구현하는 문제가 있었습니다. 여기서는 이 알고리즘을 약간 다른 형태로 구현해 보았습니다. 코드는 다음과 같습니다.
※주: 정보처리기사 시험은 2020년부터 NCS 기반으로 개정됨에 따라 기존의 알고리즘 구현 문제는 폐지되고 프로그래밍 언어 활용으로 대체되어 순서도 빈칸 채우기 문제는 출제되지 않습니다.
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): k = j if i % 2 == 0 else COL_SIZE - j - 1 s += 1 arr[i][k] = s for i in range(ROW_SIZE): # Print print("+----" * COL_SIZE + "+") for j in range(COL_SIZE): print("| %2d " % arr[i][j], end="") print("|") print("+----" * COL_SIZE + "+")
여기서는 체스판 위에 숫자를 ㄹ자 방향으로 적는 상황을 가정하고 8×8 배열로 설정하였으며, 배열 번호는 0부터 시작합니다.
우선 1번째 줄에서 배열의 크기를 정의하고 2번째 줄에서는 정의된 크기대로 0이 미리 들어가 있는 2차원 배열을 선언합니다. 또, 3번째 줄에서는 1로 시작해서 ㄹ자로 한 칸씩 이동할 때마다 1씩 커지는 변수를 선언합니다. 0으로 대입한 이유는 배열에 대입하기 전에 값이 1씩 증가하는 것으로 설정했기 때문입니다.
이제 5번 줄에서부터 반복을 시작합니다. 0부터 시작해서 행 수에서 1을 뺀 값까지 반복하는 블록을 만들고 또 6번 줄에서는 0부터 시작해서 열 수에서 1을 뺀 값까지 반복하는 블록을 만듭니다.
7번 줄에서는 대입할 열의 위치를 정하기 위해 조건문을 이용해서 대입하는데, 행 번호가 짝수이면 정방향 대입, 행 번호가 홀수이면 역방향 대입을 합니다. 첫 번째 줄이 정방향인데 왜 행 번호가 짝수일 때 정방향으로 하냐면, 배열 번호가 0부터 시작하기 때문에 첫 번째 행은 1번이 아닌 0번이 되기 때문입니다. 따라서 1-2-3-4 순이 아닌 0-1-2-3 순으로 가기 때문에 행 번호가 짝수일 때 정방향으로 하는 것입니다.
8번 줄에서는 정해진 배열 위치에 대입하기 전에 대입할 숫자를 1씩 증가시킵니다. 처음 선언할 때 0을 대입해 두었기 때문에 첫 번째 차례에서는 1이 됩니다. 그리고 9번 줄에서 1씩 증가시킨 값을 하나씩 대입합니다.
11번째 줄은 반복이 끝난 후 배열에 대입된 값을 출력하기 위해 행 숫자만큼 다시 반복합니다. 12번째 줄에서는 행의 위쪽에 선을 그리고 13번째 줄에서 열 숫자만큼 반복, 14번째 줄에서 값을 하나씩 출력합니다. 15번째 줄에는 행을 끝내는 세로선을 출력하고, 마지막으로 16번째 줄에서는 마지막 가로선을 출력하고 끝냅니다. (선을 출력하는 것은 예쁘게 보이기 위한 것으로, 필수적인 것은 아닙니다.)
이 프로그램의 결과는 다음과 같습니다.
+----+----+----+----+----+----+----+----+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +----+----+----+----+----+----+----+----+ | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | +----+----+----+----+----+----+----+----+ | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | +----+----+----+----+----+----+----+----+ | 32 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | +----+----+----+----+----+----+----+----+ | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | +----+----+----+----+----+----+----+----+ | 48 | 47 | 46 | 45 | 44 | 43 | 42 | 41 | +----+----+----+----+----+----+----+----+ | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | +----+----+----+----+----+----+----+----+ | 64 | 63 | 62 | 61 | 60 | 59 | 58 | 57 | +----+----+----+----+----+----+----+----+
너무 유용해요