본문 바로가기

Dot Algo∙ DS/PS

[BOJ] 백준 15927번 회문은 회문이 아니야!! (Java)

    #15927 회문은 회문이 아니야!!

    난이도 : 골드5

    유형 : 문자열

     

    15927번: 회문은 회문아니야!!

    팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다. 같은 의미를 가지는 여러 단어들을

    www.acmicpc.net

    ▸ 문제

    팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다.

    같은 의미를 가지는 여러 단어들을 보자.

    • 회문 (한국어)
    • palindrome (영어, 프랑스어, 노르웨이어, 그리스어, 라틴어)
    • 回文 (일본어, 중국어)
    • palindrom (독일어, 덴마크어)
    • palindromi (핀란드어)
    • palíndromo (스페인어, 포르투갈어)
    • palindromo (이탈리아어, 에스페란토어)
    • палиндром (러시아어)
    • قلب مستو (아랍어)

    뭔가 이상한 점이 보이지 않는가? 그 어떤 언어에서도 팰린드롬을 뜻하는 단어는 팰린드롬이 아니다! 많은 사람들이 추구하는 “대칭의 아름다움”은 그저 허상에 불과하다.

    알파벳 대문자로 이루어진 문자열이 주어졌을 때, 팰린드롬이 아닌 가장 긴 부분문자열의 길이를 구해 보자. 이때 부분문자열을 이루는 글자는 연속해야 한다. AB는 ABCD의 부분문자열이지만, AC는 아니다.

     입력

    길이가 1 이상 50만 이하인 문자열이 주어진다.

     출력

    팰린드롬이 아닌 가장 긴 부분문자열의 길이를 출력한다. 그런 부분문자열이 없으면 -1을 출력한다.

     

    문제 풀이  

    펠린드롬일 경우는 문자열이 서로 대칭되어있는지 봐주면 된다.

    1. 만약 주어진 문자열이 펠린드롬이 아닐 경우 전체 문자열 길이를 출력해주면 된다.
    2. 만약 주어진 문자열이 펠린드롬일 경우 전체 문자열 길이-1을 출력해주면 된다.
      1. 왜냐하면 펠린드롬은 대칭이므로 ABBA, ABA 짝수이든 홀수이든 무조건 대칭은 깨지게 되어있다.
      2. 단, 예외가 있는데 ZZZ처럼 모든 문자열이 한 문자로만 이뤄져있을 경우이다.

     

    풀이 코드 

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
    
    	public static void main(String[] args) throws IOException{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String s= br.readLine();
    		
    		boolean f = false;
    		int len = s.length();
    		for(int i=0; i<len/2; i++) {
    			if(s.charAt(i) != s.charAt(len-i-1)) {
    				System.out.println(s.length());
    				return;
    			}else if(s.charAt(i) != s.charAt(i+1)) {
    				f = true;
    			}
    			
    		}
    		if(f) {
    			System.out.println(s.length()-1);
    		}else {
    			System.out.println(-1);
    		}
    	}
    }