본문 바로가기

알고리즘/백준

백준 15927 회문은 회문아니야!!

728x90

 

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

 

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

팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다. 같은 의미를 가지는 여러 단어들을 보자. 회문 (한국어) palindrome (영어, 프랑스어, 노르웨이어, 그리스어, 라틴어) 回文 (일본어, 중국어) palindrom (독일어, 덴마크어) palindromi (핀란드어) palíndromo (스페인어, 포르투갈어) pal

www.acmicpc.net

 

입력 받은 문자열중에서 가장 긴 부분문자열을 구하는 문제이다.

 

DP문제인줄 알았지만 도무지 점화식이 생각 안 나서 다르게 생각해본결과 규칙 찾기 문제였다.

 

답이 나오는 경우는 3가지 경우밖에 없다.

 

1) 전체가 Palindrome이 아닌경우

2) 전체가 Palindrome인 경우

3) 전체가 Palindrome이면서 모두 같은 문자일 경우

 

1)의 경우 당연히 가장 긴 팰린드롬은 "문자열 길이이다." ex) PALINDROME

2)의 경우 가장 긴 팰린드롬은 "문자열길이 -1"  ex) ABCBA

3)의 경우 모두 같으므로 팰린드롬이 하나도 없다. 그러므로 "-1" ex) AAAAA

 

그러므로 모두 문자열이 모두 같은 문자인지 체크하고

그다음 전체 문자열이 팰린드롬인지만 체크해주면 된다.

 

package 백준;

import java.util.Arrays;
import java.util.Scanner;

public class 회문은회문이아니야 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		char [] s  = sc.next().toCharArray();
		//System.out.println(Arrays.toString(s));
		int l = 0;
		int r = s.length-1;
		int k = 0;
		
		//같은 문자 -1
		//palindrom len -1
		//not palndrom len
		char c = s[0];
		boolean flag = true;
		for(int i =1 ;i <=r;i++) {
			if(s[i]!=c) {
			flag = false;	
			}
		}
		if(flag) {System.out.println("-1"); return;}
		flag = true;
		
		while(l<r) {
			if(s[l]==s[r]) {
				l++;
				r--;
			}
			else {
				flag = false; 
				break;
			}
		}
		
		if(!flag) {
			//System.out.println("팰린드롱 아님");
			System.out.println(s.length);
		}
		else {
			System.out.println(s.length-1);
		}
	}

}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 1766 문제집  (0) 2020.05.13
백준 16228 GCC의 유산  (0) 2020.05.09
백준 13907 세금  (0) 2020.05.06
백준 문자열제곱 4354  (0) 2020.05.02
백준 15824 너 봄 캡사이신이 맛있단다.  (0) 2020.04.29