[백준] 팰린드롬 만들기 JAVA

김영훈·2022년 4월 18일
0

문제

동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다.

동호는 규완이를 위한 깜짝 선물을 준비했다. 동호는 규완이가 적어놓고 간 문자열 S에 0개 이상의 문자를 문자열 뒤에 추가해서 팰린드롬을 만들려고 한다. 동호는 가능하면 가장 짧은 문자열을 만들려고 한다.

동호가 만들 수 있는 가장 짧은 팰린드롬의 길이를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 최대 50이다.

출력

첫째 줄에 동호가 만들 수 있는 가장 짧은 팰린드롬의 길이를 출력한다.

예제 입력 1 복사

abab

예제 출력 1 복사

5

풀이

  • 팰린드롬이 홀수일 경우와 짝수일 경우로 나뉘어 풀 수 있었다.
  • 길이가 홀수일 경우
    • len-2 부터 시작해서 [i-J+1][i+J]를 탐색한다
  • 길이가 짝수일 경우

    • 문자 길이가 2로 나눴을때 1이 남는다면 길이에 +1을 더해준다
    • len-2 부터 시작해서 [i-j+1][i+j]를 탐색한다
  • 길이가 짧은 것을 answer에 담는다.

코드

public class Main {

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        char[] chars = br.readLine().toCharArray();

        int len = chars.length;

        int answer = (len-1) * 2 + 1;

        if (len == 1){
            System.out.println(1);
            return;
        }


        // 홀수일 경우
        loop : for (int i  = len-2 ; i > len/2-1 ; i--){

            for (int j = 1; j + i < len;  j++){
                if (chars[i-j] != chars[i+j]) continue loop;
            }

            answer = Math.min(answer, i * 2 + 1 );
        }


        // 짝수일 경우
        int end = len;
        if (len % 2 == 1) end++;
        loop : for (int i  = len-2 ; i >= end/2-1 ; i--){

            for (int j = 1; j + i < len;  j++){
                if (chars[i-j+1] != chars[i+j]) continue loop;
            }

            answer = Math.min(answer, (i+1)*2) ;
        }

        System.out.println(answer);
    }
}
profile
배우는 개발자가 되고 싶습니다.

0개의 댓글