문제 개요
이번 문제에서는 두 개의 숫자 N과 K가 주어지며, 어떤 종류의 반복문(for, while 등)도 사용하지 않고 특정 숫자 시리즈를 출력하는 프로그램을 작성하는 것이 목표입니다.
출력해야 할 시리즈의 규칙은 다음과 같습니다.
- n부터 시작하여 값이 0 또는 음수가 될 때까지 k씩 감소합니다.
- 값이 0 이하가 되면 방향을 바꿔 다시 n에 도달할 때까지 k씩 증가합니다.
- 이 전체 과정에서 반복문은 일절 사용할 수 없습니다.
입력 예시
n = 12 , k = 3
출력 예시
12 9 6 3 0 3 6 9 12
해결 접근 방법: 재귀(Recursion) 활용
반복문 없이 이 문제를 해결하는 핵심 열쇠는 바로 재귀 함수입니다. 함수가 자기 자신을 계속 호출하면서 현재 값의 크기를 검사하고, 그 값에 따라 뺄셈을 할지 덧셈을 할지 판단하게 됩니다.
이때 함수는 플래그(flag) 변수를 하나 사용합니다. 이 플래그는 현재 값이 감소 중인지 아니면 증가 중인지 상태를 추적하는 역할을 하며, 값이 0 이하로 떨어지는 순간 플래그를 반전시켜 연산 방향을 전환합니다. 또한 값이 다시 N에 도달하면 재귀 호출을 종료하여 무한 루프를 방지합니다.
구현 단계
- 현재 값을 출력합니다.
- 현재 값이 0 이하라면 플래그를 반전시켜 연산 모드를 '증가'로 전환합니다.
- 현재 값이 N이고 플래그가 이미 반전된 상태라면 재귀를 종료합니다.
- 플래그 상태에 따라 값에서 K를 빼거나 더한 뒤 자기 자신을 다시 호출합니다.
C 프로그램: 반복문 없이 숫자 시리즈 출력하기
#include <stdio.h>
// 재귀적으로 숫자 시리즈를 출력하는 함수
void PrintSeriesRec(int current, int N, int K, int flag) {
printf("%d ", current);
// 0 이하가 되면 덧셈 모드로 전환
if (current <= 0)
flag = !flag;
// 다시 N에 도달하면 종료
if (current == N && !flag)
return;
if (flag)
PrintSeriesRec(current - K, N, K, flag); // 감소 단계
else
PrintSeriesRec(current + K, N, K, flag); // 증가 단계
}
int main() {
int N = 12, K = 4;
printf("숫자 시리즈 : \n");
PrintSeriesRec(N, N, K, 1);
return 0;
}실행 결과
숫자 시리즈 : 12 8 4 0 4 8 12
코드 설명
- current: 현재 출력되는 값으로, 재귀 호출마다 K만큼 증가하거나 감소합니다.
- flag: 연산 방향을 나타내는 상태 변수입니다. true(1)일 때는 감소, false(0)일 때는 증가 단계를 의미합니다.
- 종료 조건: 값이 0 이하로 내려갔다가 다시 N에 도달하면 재귀 호출이 멈추므로, 별도의 반복문 없이도 시리즈 전체가 완성됩니다.
이처럼 재귀와 상태 플래그만 잘 활용하면 반복문 없이도 원하는 패턴의 숫자 시리즈를 손쉽게 출력할 수 있습니다. 재귀 호출은 내부적으로 콜 스택을 사용한다는 점을 기억하면, 반복문 대신 재귀로 문제를 해결하는 사고방식을 다양한 알고리즘에 적용해 볼 수 있습니다.