[백준] 25501

당당·2023년 5월 18일
0

백준

목록 보기
112/179
post-thumbnail

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

📔문제

정휘는 후배들이 재귀 함수를 잘 다루는 재귀의 귀재인지 알아보기 위해 재귀 함수와 관련된 문제를 출제하기로 했다.

팰린드롬이란, 앞에서부터 읽었을 때와 뒤에서부터 읽었을 때가 같은 문자열을 말한다. 팰린드롬의 예시로 AAA, ABBA, ABABA 등이 있고, 팰린드롬이 아닌 문자열의 예시로 ABCA, PALINDROME 등이 있다.

어떤 문자열이 팰린드롬인지 판별하는 문제는 재귀 함수를 이용해 쉽게 해결할 수 있다. 아래 코드의 isPalindrome 함수는 주어진 문자열이 팰린드롬이면 1, 팰린드롬이 아니면 0을 반환하는 함수다.

#include <stdio.h>
#include <string.h>

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

int isPalindrome(const char *s){
    return recursion(s, 0, strlen(s)-1);
}

int main(){
    printf("ABBA: %d\n", isPalindrome("ABBA")); // 1
    printf("ABC: %d\n", isPalindrome("ABC"));   // 0
}

정휘는 위에 작성된 isPalindrome 함수를 이용하여 어떤 문자열이 팰린드롬인지 여부를 판단하려고 한다.

구체적으로는, 문자열 SS를 isPalindrome 함수의 인자로 전달하여 팰린드롬 여부를 반환값으로 알아낼 것이다. 더불어 판별하는 과정에서 recursion 함수를 몇 번 호출하는지 셀 것이다.

정휘를 따라 여러분도 함수의 반환값과 recursion 함수의 호출 횟수를 구해보자.


📝입력

첫째 줄에 테스트케이스의 개수 TT가 주어진다. (1T10001 \leq T \leq 1\,000)

둘째 줄부터 TT개의 줄에 알파벳 대문자로 구성된 문자열 SS가 주어진다. (1S10001 \leq \vert S\vert \leq 1\,000)


📺출력

각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다.


📝예제 입력 1

5
AAA
ABBA
ABABA
ABCA
PALINDROME

📺예제 출력 1

1 2
1 3
1 3
0 2
0 1

🔍출처

High School > 선린인터넷고등학교 > 2022 선린 정보 알고리즘경시대회 A번
-문제를 검수한 사람: cgiosy, chansol, junseo, kyo20111, ryute, stonejjun03
-문제를 만든 사람: jhnah917


🧮알고리즘 분류

  • 구현
  • 문자열
  • 재귀

📃소스 코드

import java.util.Scanner;

public class Code25501 {
    static int count=0;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int T=sc.nextInt();

        for(int i=0;i<T;i++){
            System.out.print(isPalindrome(sc.next())+" ");
            System.out.println(count);

            count=0;
        }
    }
    public static int recursion(String s,int left, int right){
        count++;
        if(left>=right) {
            return 1; //한글자 자리면!!
        }
        else if(s.charAt(left)!=s.charAt(right)){
            return 0;
        }
        else {
            return recursion(s, left + 1, right - 1);
        }
    }
    public static int isPalindrome(String str){
        return recursion(str,0,str.length()-1);
    }
}

📰출력 결과


📂고찰

팰린드롬을 직접 코딩해야했으면 더 난이도가 올라갔을 것 같다. 그런데 위에 작성된 함수를 이용하라고 했으니 저것을 JAVA 로 바꾸기만 하면 된다.

recursion함수를 보면, 왼쪽은 0부터 시작하고 오른쪽은 문자열의 제일 마지막 인덱스부터 시작하면서 서로 같은지 확인하고 같으면 1, 다르면 0을 반환한다. 다른건 아니라면 다시 함수를 호출해서 반복한다.

profile
MySQL DBA 신입 지원

0개의 댓글