마방진(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 인지 먼저 조건 검사를 수행하고, 충돌 발생 시 원본 위치 바로 밑 칸으로 회피 기동시키는 분기 제어 설계가 이 알고리즘의 핵심이다.
'프로그래밍 > RM-COBOL' 카테고리의 다른 글
| [COBOL 기초] 알고리즘 4편: 최대공약수와 최소공배수 구하기 COBOL code (0) | 2026.06.22 |
|---|---|
| [COBOL 기초] 알고리즘 3편: 소수 판별 및 약수 구하기 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 알고리즘 2편: 피보나치 수열과 팩토리얼 계산 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 알고리즘 1편: 1에서 100까지 합 구하기 기본 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 종합 프로젝트: 실전 성적 시스템 구축으로 마스터하는 COBOL code (0) | 2026.06.22 |