0x0B 재귀 P17478 - 재귀함수가 뭔가요?

Jieun·2024년 5월 26일
0

코테

목록 보기
8/18

문제

https://www.acmicpc.net/problem/17478

처음에 제출한 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class P17478 {
    static int n;
    static StringBuilder sb = new StringBuilder();
    static String[] str = {
            "\"재귀함수가 뭔가요?\"\n",
            "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n",
            "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n",
            "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n",
            "\"재귀함수는 자기 자신을 호출하는 함수라네\"\n",
            "라고 답변하였지.\n",
            "____"
    };
    static void recursion(int N) {
        if(N==0) {
            sb.append(str[6].repeat(n-N));
            sb.append(str[0]);
            sb.append(str[6].repeat(n-N));
            sb.append(str[4]);
            sb.append(str[6].repeat(n-N));
            sb.append(str[5]);
            return;
        }
        sb.append(str[6].repeat(n-N));
        sb.append(str[0]);
        sb.append(str[6].repeat(n-N));
        sb.append(str[1]);
        sb.append(str[6].repeat(n-N));
        sb.append(str[2]);
        sb.append(str[6].repeat(n-N));
        sb.append(str[3]);
        recursion(--N);
        sb.append(str[6].repeat(n-N-1));
        sb.append(str[5]);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        sb.append("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");
        recursion(n);
        System.out.println(sb);
    }
}

구린 점

아직 절차지향적 사고에 갇혀.. 아님 그냥 생각을 덜 해서..?
어차피 파라미터로 넘겨주는 변수 N을 직접 --N 할 필요가 없는데 그렇게 해서 마지막 repeat는 (n-N-1)을 하도록 만들어 버렸다.
-> 1. 굳이 변수를 직접 바꿀 필요 없으니 그냥 파라미터로 넘기면서 빼라~

그리고 다른 코드들은 언더바를 정해진 만큼 더하거나, 저 부분을 함수로 빼던데 너무 일차적으로 해결한 감이 있다.
또 어차피 재귀라 코드 상으로 문장들을 반복해서 쓸 일이 적은데 냅다 배열로 만들어버렸다는 점이다.
굳이 해서 직관성이 떨어진 느낌

그리고 첫 번째 문장은 base condition일 때도 아닐 때도 포함 되므로 위로 빼도 된다는걸 캐치하지 못 했다.

바꿔본 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class P17478 {
    static int n;
    static StringBuilder sb = new StringBuilder();
    static void recursion(int N) {
        sb.append("____".repeat(N));
        sb.append("\"재귀함수가 뭔가요?\"\n");
        if(N==n) {
            sb.append("____".repeat(N));
            sb.append("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n");
            sb.append("____".repeat(N));
            sb.append("라고 답변하였지.\n");
            return;
        }
        sb.append("____".repeat(N));
        sb.append("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n");
        sb.append("____".repeat(N));
        sb.append("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n");
        sb.append("____".repeat(N));
        sb.append("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n");
        recursion(N+1);
        sb.append("____".repeat(N));
        sb.append("라고 답변하였지.\n");
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        sb.append("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");
        recursion(0);
        System.out.println(sb);
    }
}

크게 다른 것 같진 않지만 ^-^
BFS는 그래도 재밌었는데, 이건 진짜 접근부터가 너무 생소해서 어렵다
계속 풀다보면 늘겠지~

0개의 댓글