알고리즘

[BOJ] 25501 - 재귀의 귀재(JS)

로돌씨 2024. 11. 5. 16:53

 

 재귀 함수란?

함수가 자기 자신을 다시 호출하는 함수.

 

재귀 함수의 장단점

  • 장점: 코드가 간결해지고, 수학적으로 정의된 문제(피보나치 수열, 팩토리얼 등)를 직관적으로 구현할 수 있습니다.
  • 단점: 호출 스택이 커질 수 있어 메모리를 많이 사용하고, 큰 입력에서는 성능이 떨어질 수 있습니다.

 

풀이

let fs = require("fs");
let input = fs.readFileSync('예제.txt').toString().trim().split("\n")
let N = input.shift()

let cnt = 0;

const recursion = (s,l,r) =>{
    cnt += 1;
    if(l >=r ){
        return 1;
    }else if(s[l] != s[r] ){
        return 0;
    } else {
        return recursion (s, l +1 , r-1);
    }
};

const isPalinderome =(s) =>{
    return recursion(s,0,s.length -1);
}

for( i = 0; i <N; i++){
    cnt = 0;
    console.log(isPalinderome(input[i].trim()) ,cnt);
}

 

recursion(s, l, r): 재귀적으로 회문을 판별하는 함수로, 문자열 s의 l번째 문자와 r번째 문자를 비교합니다.

  • cnt += 1: recursion이 호출될 때마다 cnt를 1씩 증가시킵니다.
  • if (l >= r): 인덱스 l이 r보다 크거나 같으면(즉, 중앙에 도달하거나 비교할 문자가 더 이상 없으면) 회문이므로 1을 반환합니다.
  • else if (s[l] !== s[r]): 양 끝 문자가 다르면 회문이 아니므로 0을 반환합니다.
  • else: 양 끝 문자가 같으면, l을 1 증가시키고 r을 1 감소시켜 recursion을 다시 호출하여 가운데로 이동합니다.

isPalindrome(s): 주어진 문자열 s가 회문인지 확인하는 함수로, recursion(s, 0, s.length - 1)를 호출하여 회문 여부를 반환합니다.

 

for 반복문으로 테스트 케이스마다 cnt를 0으로 초기화하여 재귀 호출 횟수를 새로 셉니다.

isPalindrome(input[i].trim()): 각 테스트 케이스가 회문인지 확인하고, 결과(1 또는 0)와 cnt를 출력합니다.