본문 바로가기
프로그래밍/RM-COBOL

[COBOL 기초] 알고리즘 5편: 2차원 테이블 배열을 이용한 홀수 마방진 만들기 COBOL code

by 오!쎈세! 2026. 6. 22.
마방진(Magic Square)은 가로, 세로, 대각선의 합이 모두 같도록 정사각형 숫자를 배열하는 것임. 코볼의 2차원 배열 구조인 OCCURS 구문과 우상향 이동 후 경계를 처리하는 복합 인덱스 제어 알고리즘을 구현해 본다.
🟪 1. 2차원 테이블 배열 및 행렬 인덱스 설계 (DATA DIVISION)
코볼은 타 언어의 int arr[5][5] 같은 선언을 데이터 계층 구조와 OCCURS 키워드로 표현함. 5x5 홀수 마방진을 위한 테이블과 위치 제어용 행/열 인덱스를 선언한다.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  MAGIC-SQUARE-TABLE.
*          -------------------------------------------------------------
*          [2차원 배열 선언] 5행 5열 구조의 숫자 테이블 공간 확보 (B영역 시작)
*          -------------------------------------------------------------
           05  ROW-DATA    OCCURS 5 TIMES.
               10  COL-DATA  OCCURS 5 TIMES.
                   15  CELL-VAL  PIC 9(02) VALUE ZERO.

       01  INDEX-VARIABLES.
*          -------------------------------------------------------------
*          [행렬 위치 제어 변수] 현재 행(R), 열(C) 및 다음 이동 위치 백업 변수
*          -------------------------------------------------------------
           05  CUR-R       PIC 9(02)     VALUE 1.
           05  CUR-C       PIC 9(02)     VALUE 3.
           05  NEXT-R      PIC 9(02)     VALUE ZERO.
           05  NEXT-C      PIC 9(02)     VALUE ZERO.
*          [값 누적 및 출력 인덱스] 채워넣을 숫자(1~25) 및 화면 출력용 인덱스
           05  FILL-NUM    PIC 9(02)     VALUE 1.
           05  P-R         PIC 9(02)     VALUE 1.
           05  P-C         PIC 9(02)     VALUE 1.
코드를 사용할 때는 주의가 필요합니다.
 

🟩 2. 홀수 마방진 우상향 배치 로직 실행 (PROCEDURE DIVISION)
첫 숫자를 1행 중앙에 배치한 후, 우상향 대각선(행-1, 열+1)으로 이동하며 칸을 채우는 영역임. 벽에 부딪히거나 기존 숫자가 있으면 아래 칸으로 밀려나는 예외 처리 연산을 수행함.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       PROCEDURE DIVISION.
       MAIN-LOGIC SECTION.
       A000-START.
           DISPLAY "--- 5X5 MAGIC SQUARE PROCESS START ---".

*          =============================================================
*          [마방진 핵심 루프] 1부터 25까지 숫자를 조건에 맞춰 채워넣음
*          =============================================================
           PERFORM UNTIL FILL-NUM > 25
*              [값 할당] 현재 행과 열 위치의 배열 칸에 숫자를 대입함
               MOVE FILL-NUM TO CELL-VAL(CUR-R, CUR-C)
               
*              [우상향 이동 규칙] 행은 위로(-1), 열은 오른쪽으로(+1) 임시 계산
               COMPUTE NEXT-R = CUR-R - 1
               COMPUTE NEXT-C = CUR-C + 1
               
*              [경계 예외 처리 1] 행이 맨 위(0)를 뚫고 나가면 맨 아래 행(5)으로 이동
               IF NEXT-R = 0
                   MOVE 5 TO NEXT-R
               END-IF
               
*              [경계 예외 처리 2] 열이 맨 오른쪽(6)을 뚫고 나가면 맨 왼쪽 열(1)로 이동
               IF NEXT-C = 6
                   MOVE 1 TO NEXT-C
               END-IF
               
*              [기존 값 중복 처리] 가려는 위치에 이미 0이 아닌 숫자가 차 있는 경우
               IF CELL-VAL(NEXT-R, NEXT-C) NOT = 0
*                  방금 채운 원본 좌표의 바로 아래 행(+1)으로 강제 이동함
                   COMPUTE CUR-R = CUR-R + 1
*                  [특수 벽 예외] 맨 아래 행을 뚫고 나가면 1행으로 보정
                   IF CUR-R = 6
                       MOVE 1 TO CUR-R
                   END-IF
               ELSE
*                  중복이 없으면 임시로 계산했던 우상향 좌표를 현재 위치로 최종 확정
                   MOVE NEXT-R TO CUR-R
                   MOVE NEXT-C TO CUR-C
               END-IF
               
               ADD 1 TO FILL-NUM
           END-PERFORM.

*          =============================================================
*          [행렬 출력] 완성된 5x5 마방진 결과를 2중 루프로 화면에 표출
*          =============================================================
           DISPLAY "========= COMPLETED MAGIC SQUARE =========".
           PERFORM UNTIL P-R > 5
               DISPLAY CELL-VAL(P-R, 1) "  " CELL-VAL(P-R, 2) "  "
                       CELL-VAL(P-R, 3) "  " CELL-VAL(P-R, 4) "  "
                       CELL-VAL(P-R, 5)
               ADD 1 TO P-R
           END-PERFORM.

           STOP RUN.
코드를 사용할 때는 주의가 필요합니다.
 

💡 [실무 팁] COBOL 2차원 배열의 인덱스 규칙과 기하학적 예외 처리
정보처리기능사 시험장지에서 디버깅 표(Trace 테이블)를 그릴 때 수험생들을 가장 헷갈리게 했던 다중 조건 메커니즘을 짚어봄.
  • 타 언어와 다른 코볼의 2차원 테이블 참조 방식
    • 현대 C/Java 기반 언어는 arr[R][C] 처럼 대괄호를 연속해서 붙여 배열 위치를 가리킴.
    • 반면 코볼은 그룹 이름 아래 종속된 최하위 변수명 뒤에 괄호를 열고 쉼표나 공백으로 행렬을 구분하여 CELL-VAL(CUR-R, CUR-C) 형태로 참조함. 괄호 안의 순서는 상위 OCCURS(ROW-DATA)가 먼저, 하위 OCCURS(COL-DATA)가 나중으로 배치되어 행-열 구조를 그대로 따름.
  • 우상향 교차 지점의 대참사 막기 (중복 처리)
    • 마방진 알고리즘의 가장 큰 난관은 우상향으로 이동한 자리에 이미 이전 루프에서 채워놓은 숫자가 들어있을 때임.
    • 이때 예외 처리를 정교하게 해주지 않으면 이미 계산된 소중한 기존 데이터를 덮어써 버려(Data Overwrite), 가로·세로의 합이 깨지는 치명적인 논리 오류를 뱉게 됨.
    • 이동하려는 임시 좌표(NEXT-R, NEXT-C)의 값이 NOT = 0 인지 먼저 조건 검사를 수행하고, 충돌 발생 시 원본 위치 바로 밑 칸으로 회피 기동시키는 분기 제어 설계가 이 알고리즘의 핵심이다.