백준 17478 - 재귀함수가 뭔가요? (C언어 구현)

컴퓨터/문제풀이집

728x90
반응형

 

 

17478번: 재귀함수가 뭔가요?

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다. 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대

www.acmicpc.net

서론

백준 단계별로 풀어보기에 재귀 영역에 있는 문제입니다.

재귀 함수를 통한 해결법을 제시하기를 바라는 문제입니다.

 

문제 파악

  • 입력 N이 주어진다(N번 제출력)
  • N은 1 이상 50 이하의 값이다.
  • 입력에 따른 반복적인 출력을 한다.

출력 부분은 크게 3가지 부분으로 나눌 수 있다.

  • "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다." - 첫 시작 부분
  • "재귀 함수가 뭔가요?"~그 선인에게 한 선비가 찾아와서 물었어." - 반복 부분
  • "재귀 함수는 자기 자신을 ~ "라고 답변하였지. - 종료 부분

이 부분을 코드로 써 내려가기 전 구분을 지어보자면,

  • 첫 시작 부분은 한 번만 출력한다.
  • 반복 부분은 계속해서 호출하여 출력한다 단, 재귀가 깊어질수록 _ 를 4개씩 추가하여 출력한다.
  • 종료 부분은 반복 횟수가 끝나는 시점에서 출력한다.

구현

#include<stdio.h>

//전역변수 - 재귀 반복 회수 
int N;


//재귀함수 진행하면서 _를 출력하기 위한 부분
void func(int cnt){
    for(int i = 0 ; i < cnt*4;i++){
    printf("_");
    }
}

//재귀 함수 부분
void solve(int cnt){
    
    //종료 부분
    if(cnt == N ){
        func(cnt);
        printf("\"재귀함수가 뭔가요?\"\n");
        func(cnt);
        printf("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n");
        func(cnt);
        printf("라고 답변하였지.\n");
        return;
    }

    //계속해서 반복회수에 따른 _및 반복 부분을 출력한다.
    func(cnt);
    printf("\"재귀함수가 뭔가요?\"\n");
    func(cnt);
    printf("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n");
    func(cnt);
    printf("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n");
    func(cnt);
    printf("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n");
    
    //***** 반복 부분이후 재귀함수로 다시 반복부분을 호출한다 ****//
    solve(cnt+1);
    func(cnt);
    printf("라고 답변하였지.\n");
}


// main함수
int main(){
    //재귀 회수 입력
    scanf("%d",&N);
    
    
    //초기문 출력
    printf("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");
    
    //재귀 함수 시작
    solve(0);
    
    return 0;
}

후기

재귀 함수를 간단하게 이해하는 문제 중 하나라고 생각했습니다.

다만, 수학적 계산이 아닌 문자열의 출력이기 때문에 다소 생소한 부분이 있었습니다.

재귀 함수에서 함수의 호출 시점과 종료 시점의 설정을 어떻게 하는지 잘 익힐 수 있었습니다.

더 개선하여 조금 더 깔끔한 소스코드가 있을 수도 있지만... 동작은 잘하니 마무리하겠습니다.

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :