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

[COBOL 기초] 알고리즘 2편: 피보나치 수열과 팩토리얼 계산 COBOL code

by 오!쎈세! 2026. 6. 22.
피보나치 수열은 앞의 두 숫자를 더해 다음 숫자를 만드는 규칙이며, 팩토리얼은 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로 시작해야 정상 작동한다.