재귀(Recursion) 팀 활동결과-<백준17478-C>

채재헌·2022년 7월 8일
0

🎇1.문제

<링크GO GO~!!>
=>https://www.acmicpc.net/problem/17478

✨2.접근방법

우선 각 문장 6개를 각각 출력해 주기 위해서 문자 배열 str[7]을 만들어 문자 배열에 한 문장씩 넣어줍니다. 그리고 n과 입력값 N 값이 같아질 때까지 함수를 계속 호출해야 되는 것을 깨닫고, 함수가 다시 호출될 때마다 __의 출력이 1번씩 늘어나게 합니다. 그러고 나서 재귀 함수 호출 루프에서 빠져나와 n과 N의 값이 같아질 때 __의 출력값이 n 번 출력되는 동시에 str[4]에서 str[6]까지의 문장들을 한 루프마다 출력해 줍니다 그리고 마지막 문장이 n 번 반복될 때마다 ____의 출력이 1번씩 줄어들어드는 반복문을 만든다면 해당 문제의 답이 나올 것이라고 생각했습니다.

🎈3.코드+주석

#include <stdio.h>
int N;
const char *str[7] = {
    "\"재귀함수가 뭔가요?\"", //str[0]
    "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.", str[1]
    "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.",str[2]
    "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"",//str[3]
    "\"재귀함수가 뭔가요?\"",str[4]
    "\"재귀함수는 자기 자신을 호출하는 함수라네\"",str[5]
    "라고 답변하였지."str[6]
    //"\0"=>str[7]
};
void message(int n){
    for (int i = 0; i < 4; i++){
        for (int j = 1; j < n; j++) printf("____");	//str[i]앞에 쓰여 함수가 재호출 될때 마다 출력횟수가 1씩증가
        puts(str[i]);	str[0]~str[3] 출력
    }
    if (n != N) message(n+1); //n!=N이면 message(n+1)을 하여 함수를 다시 호출 
    else //n==N이라면
        for (int i = 4; i < 7; i++){ 
            for (int j = 0; j < n; j++) printf("____");//반복 루프 돌때마다 출력횟수 1씩 증가
            puts(str[i]);	//str[4]~str[6]까지 출력
        }
    for (int j = 1; j < n; j++) printf("____");
    puts(str[6]);	//str[6]을 출력
}
int main(){
    scanf("%d", &N);	//문장을 반복할 횟수 입력값
    puts("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
    message(1);
}

🧨4.알고리즘

⑴ 각 문장을 반복할 횟수를 입력하고, 반복 없는 초기 실행 문장 “puts()”를 출력한다.

⑵ 반복할 문장인 배열 str[0]~str[3]을 출력하기 위해 message(1)을 하여 함수 호출을 해서 배열 str[0]~str[3]까지의 문장을 출력한다. (이때, n의 값이 1이기 때문에 지금 printf("____")는 출력되지 않는다.)

⑶ 반복 횟수(N)를 3이라고 가정할 때, n의 값(1)이 입력값 N의 값과 같지 않기 때문에, n의 값과 N의 값이 같아질 때까지 n에다가 1을 더해 재귀 호출을 한다.

message(n+1) 함수를 호출하면 i는 0부터 3까지(str[0]~str[3])의 범위와, j는 1부터 n-1까지의 범위를 가져 배열 str[0]~str[3]의 문장 즉, 함수가 재호출 될 때마다 j의 값이 1씩 증가하여

printf(“____”)의 출력 횟수가 1개씩 늘어나며 주어진 범위의 주어진 반복 문장과 함께 반복된다.

(printf("____")는 배열 str[0]~str[3] 문장 앞에 쓰여 반복된 문장을 구분하기 위해서 쓰임, j의 값이 1씩 늘어날수록 출력도 하나씩 늘어난다.)

⑷ 3번과 같이 함수가 계속 호출되면서 n 값과 N 값이 같아지면 재귀 함수 호출 루프에서

빠져나와 i는 4부터 6까지, j는 0부터 n-1까지의 범위를 가져, printf(“____”)의 출력 횟수가

N 번 반복되고 뒤에 str[4]가 출력된다. 그리고 이러한 패턴으로 str[i]가 6이 될 때까지 반복문을 계속 반복한다.

⑸ 4번의 반복문이 끝나고 문자열 str[6]의 문장이 n 번 반복될 때마다 __의 출력이 1번씩 줄어들어드는 반복문을 통해 printf(“__”)와 str[6] 문장을 같이 출력한다.

⑹ 프로그램 종료

🎆5. 문제화면 캡쳐화면

😄6. 느낌점

이번 백준 코딩 테스트 사이트 문제를 풀어보면서 처음에 출력 화면에 주어진 문장을 저장하기 위해 문자열이 필요하다는 것을 깨닫고 이 문장을 활용한 재귀 함수 호출을 어떠한 조건문으로 호출하고 빠져올 수 있을지를 고민하는 것이 문제의 핵심 포인트라고 생각하였습니다. 그리고 출력 화면의 반복 문장 옆에 표시하는 ”____“도 이 문제의 특성이라고 생각하고 코드를 어떻게 구성하면 출력 화면과 똑같이 나올 수 있을지 여러 번 생각게 되었습니다. 비록 코딩하는 과정에서 시간이 많이 소모가 되었지만 문제의 핵심 포인트인 재귀 함수 호출이라는 개념에 대해 다시 한번 생각하게 되었고, 결국 재호출할 함수의 위치를 도출하여 주어진 조건문과 함께 함수를 재호출 할 수 있었습니다. 저는 이번 과제를 통해 코딩 테스트를 할 때 필요한 시간을 많이 줄여야 된다는 생각이 들었고, 이를 위해서는 문제의 핵심 포인트를 잘 이해하고 기존의 완벽하게 숙지하지 못한 C언어에 대한 기본 문법들을 나만의 언어로 숙달하여 코드를 구성할 때 막힌 부분을 인터넷 도움 없이 능숙하게 스스로 해결해야 한다고 생각하였습니다.

0개의 댓글