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

[COBOL 기초] 알고리즘 3편: 소수 판별 및 약수 구하기 COBOL code

by 오!쎈세! 2026. 6. 22.
소수(Prime Number)는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수이며, 약수(Divisor)는 어떤 수를 나누어떨어지게 하는 수임. 코볼의 나누기 명령문인 DIVIDE의 나머지(REMAINDER) 기능을 활용하여 두 가지 핵심 알고리즘을 구현해 본다.
🟪 1. 데이터 영역 설계 (DATA DIVISION)
나눗셈 연산 시 몫을 받아줄 임시 변수와, 조건 판별의 핵심인 나머지 데이터를 저장할 변수들을 선언함.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  PRIME-VARIABLES.
*          -------------------------------------------------------------
*          [소수 판별 변수] 테스트할 대상 숫자(TARGET)와 나눌 수(DIVISOR) 선언 (B영역)
*          -------------------------------------------------------------
           05  PRM-TARGET  PIC 9(03)     VALUE 017.
           05  PRM-DIVISOR PIC 9(03)     VALUE 2.
           05  PRM-QUO     PIC 9(03)     VALUE ZERO.
           05  PRM-REM     PIC 9(03)     VALUE ZERO.
*          [상태 플래그] 소수가 아님이 판명되면 'N'으로 바꿀 상태 플래그
           05  IS-PRIME    PIC X(01)     VALUE "Y".

       01  DIVISOR-VARIABLES.
*          -------------------------------------------------------------
*          [약수 구하기 변수] 12의 약수들을 루프를 돌며 전부 찾아낼 버퍼 영역
*          -------------------------------------------------------------
           05  DIV-TARGET  PIC 9(03)     VALUE 012.
           05  DIV-IDX     PIC 9(03)     VALUE 1.
           05  DIV-QUO     PIC 9(03)     VALUE ZERO.
           05  DIV-REM     PIC 9(03)     VALUE ZERO.
 
 

🟩 2. 나머지 연산을 통한 조건 분기 (PROCEDURE DIVISION)
소수 판별은 2부터 대상 숫자 직전까지 나누어가며 나머지가 0이 되는지 감시하고, 약수 구하기는 1부터 대상 숫자까지 나누어 나머지가 0인 인덱스를 필터링하여 화면에 출력함.
cobol code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
       PROCEDURE DIVISION.
       MAIN-LOGIC SECTION.
       A000-START.
           DISPLAY "--- PRIME & DIVISOR ALGORITHM START ---".

*          =============================================================
*          [알고리즘 A] 소수(Prime Number) 판별 루프
*          =============================================================
*          대상 숫자 직전까지 반복 수행함
           PERFORM UNTIL PRM-DIVISOR >= PRM-TARGET
*              [코볼 나머지 연산] TARGET을 DIVISOR로 나누어 몫(QUO)과 나머지(REM) 획득
               DIVIDE PRM-TARGET BY PRM-DIVISOR 
                   GIVING PRM-QUO REMAINDER PRM-REM
               
*              나머지가 0이라는 것은 1과 자신 외에 다른 수로 나누어떨어졌다는 뜻임
               IF PRM-REM = 0
                   MOVE "N" TO IS-PRIME
               END-IF
               
               ADD 1 TO PRM-DIVISOR
           END-PERFORM.

*          [소수 결과 출력] 플래그 값에 따라 최종 상태를 표출함
           IF IS-PRIME = "Y"
               DISPLAY PRM-TARGET " 결과: 소수(PRIME) 입니다."
           ELSE
               DISPLAY PRM-TARGET " 결과: 소수가 아닙니다."
           END-IF.

*          =============================================================
*          [알고리즘 B] 약수(Divisor) 구하기 루프
*          =============================================================
           DISPLAY "NUMBER " DIV-TARGET " 의 약수 목록:".

           PERFORM UNTIL DIV-IDX > DIV-TARGET
               DIVIDE DIV-TARGET BY DIV-IDX 
                   GIVING DIV-QUO REMAINDER DIV-REM
               
*              나머지가 0인 인덱스 번호만 약수로 판단하여 화면에 즉시 찍어줌
               IF DIV-REM = 0
                   DISPLAY DIV-IDX
               END-IF
               
               ADD 1 TO DIV-IDX
           END-PERFORM.

           STOP RUN.
 
 

💡 [실무 팁] 코볼의 특수한 나눗셈 구조와 REMAINDER 명령어 규칙
타 언어(C, Java, Python)에서는 기호 한 줄(%)로 간단하게 처리하는 나머지 연산이지만, 코볼은 철저하게 서술형 명령어를 사용해야 하므로 문법적 에러에 특히 주의해야 함.
  • 몫과 나머지를 동시에 구하는 DIVIDE 규칙
    • 코볼에서 나머지를 얻으려면 반드시 DIVIDE A BY B GIVING C REMAINDER D 구문을 완성해야 함.
    • 이때 GIVING C를 생략하고 REMAINDER D만 적으면 컴파일 오류가 발생함. 나누기 결과가 담길 몫 변수(C) 자리를 형식상으로라도 반드시 채워두는 것이 코볼 DIVIDE 구문의 문법적 철칙임.
  • 효율적인 소수 탈출 조건 (정보처리기능사 응용 팁)
    • 위의 예제는 이해를 돕기 위해 대상 숫자 직전까지 루프를 돌렸지만, 사실 중간에 약수가 한 번이라도 발견되어 IS-PRIME이 "N"이 되는 순간 더 이상 루프를 돌 필요가 없음.
    • 실무 및 자격증 시험에서는 성능 최적화를 위해 탈출 조건문 영역에 UNTIL PRM-DIVISOR >= PRM-TARGET OR IS-PRIME = "N" 과 같이 다중 조건을 결합하여 배치의 효율성을 끌어올리는 설계가 권장됨.