소수(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" 과 같이 다중 조건을 결합하여 배치의 효율성을 끌어올리는 설계가 권장됨.
'프로그래밍 > RM-COBOL' 카테고리의 다른 글
| [COBOL 기초] 알고리즘 5편: 2차원 테이블 배열을 이용한 홀수 마방진 만들기 COBOL code (0) | 2026.06.22 |
|---|---|
| [COBOL 기초] 알고리즘 4편: 최대공약수와 최소공배수 구하기 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 |