피보나치 수열은 앞의 두 숫자를 더해 다음 숫자를 만드는 규칙이며, 팩토리얼은 1부터 N까지 연속해서 곱하는 연산임. 알고리즘 설계의 핵심인 '변수 값 밀어내기'와 '누적 곱셈'의 원리를 코볼 코드로 구현해 본다.
🟪 1. 데이터 영역 설계 (DATA DIVISION)
수열 회전 시 이전 값을 보관할 임시 변수들과, 팩토리얼 곱셈 값이 기하급수적으로 커질 것에 대비해 넉넉한 숫자형 공간(PIC 9)을 확보해 둔다.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FIBONACCI-VARS.
* -------------------------------------------------------------
* [피보나치 변수] 첫 번째(A), 두 번째(B), 합산결과(C) 변수 선언 (B영역)
* -------------------------------------------------------------
05 FIBO-A PIC 9(04) VALUE 1.
05 FIBO-B PIC 9(04) VALUE 1.
05 FIBO-C PIC 9(04) VALUE ZERO.
05 FIBO-IDX PIC 9(02) VALUE 3.
01 FACTORIAL-VARS.
* -------------------------------------------------------------
* [팩토리얼 변수] 5!(5 팩토리얼)을 구하기 위한 루프 인덱스와 결과 변수
* -------------------------------------------------------------
05 FACT-IDX PIC 9(02) VALUE 1.
05 FACT-LIMIT PIC 9(02) VALUE 5.
* [누적곱 변수] 초깃값은 0이 아닌 반드시 1로 설정해야 연산이 작동함
05 FACT-RESULT PIC 9(06) VALUE 1.
🟩 2. 두 가지 알고리즘 반복 연산 (PROCEDURE DIVISION)
피보나치는 변수 값을 교체하며 10번째 수열까지 구하고, 팩토리얼은 지정된 리미트(5)까지 곱셈을 누적하는 영역임.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
PROCEDURE DIVISION.
MAIN-LOGIC SECTION.
A000-START.
DISPLAY "--- FIBONACCI & FACTORIAL START ---".
* =============================================================
* [알고리즘 A] 피보나치 수열 10번째 항까지 구하기 루프
* =============================================================
DISPLAY "FIBONACCI: " FIBO-A.
DISPLAY "FIBONACCI: " FIBO-B.
PERFORM UNTIL FIBO-IDX > 10
COMPUTE FIBO-C = FIBO-A + FIBO-B
DISPLAY "FIBONACCI: " FIBO-C
* [핵심 로직] 다음 회전을 위해 변수 값을 왼쪽으로 한 칸씩 밀어냄
MOVE FIBO-B TO FIBO-A
MOVE FIBO-C TO FIBO-B
ADD 1 TO FIBO-IDX
END-PERFORM.
* =============================================================
* [알고리즘 B] 5 팩토리얼 (5!) 누적 곱셈 루프
* =============================================================
PERFORM UNTIL FACT-IDX > FACT-LIMIT
* [누적 곱] 기존 결과값에 인덱스를 지속적으로 곱해줌
COMPUTE FACT-RESULT = FACT-RESULT * FACT-IDX
ADD 1 TO FACT-IDX
END-PERFORM.
DISPLAY "5 FACTORIAL (5!) RESULT : " FACT-RESULT.
* -> 정상 구동 시 5 * 4 * 3 * 2 * 1 연산 결과인 '120'이 출력됨.
STOP RUN.
💡 [실무 팁] 피보나치 '값 밀어내기'와 팩토리얼 '초깃값 1'의 규칙
정보처리기능사 시험지 순서도에서 화살표 방향을 헷갈려 대량 오답을 유발하던 두 가지 핵심 포인트를 정리함.
- 피보나치 값 복사의 순서 정하기
- C = A + B 연산이 끝난 후 값을 밀어낼 때, 반드시 MOVE B TO A를 먼저 하고 MOVE C TO B를 해야 함.
- 만약 순서를 뒤바꿔 MOVE C TO B를 먼저 실행하면, 변수 B가 가지고 있던 원본 데이터가 소멸되어 다음 라인에서 MOVE B TO A를 할 때 엉뚱한 값 C가 복사되는 논리 오류가 발생함.
- 팩토리얼 변수의 초기화 스킬
- 더하기 연산 변수는 쓰레기 값을 지우기 위해 VALUE ZERO로 초기화하는 것이 철칙이었음.
- 반면 곱셈을 누적하는 변수(FACT-RESULT)를 ZERO로 초기화하면 0 * 1 = 0, 0 * 2 = 0이 되어 최종 결과가 무조건 0으로 수렴하는 대참사가 발생함. 곱셈 연산 버퍼는 반드시 VALUE 1로 시작해야 정상 작동한다.
'프로그래밍 > RM-COBOL' 카테고리의 다른 글
| [COBOL 기초] 알고리즘 4편: 최대공약수와 최소공배수 구하기 COBOL code (0) | 2026.06.22 |
|---|---|
| [COBOL 기초] 알고리즘 3편: 소수 판별 및 약수 구하기 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 알고리즘 1편: 1에서 100까지 합 구하기 기본 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 종합 프로젝트: 실전 성적 시스템 구축으로 마스터하는 COBOL code (0) | 2026.06.22 |
| [COBOL 기초] 특수 제어문(STRING, EVALUATE)으로 가독성을 높이는 COBOL code 작성법 (0) | 2026.06.22 |