본문 바로가기

문제 풀이/인프런

[JAVA11/알고리즘]1-8 유효한 팰린드롬

문제

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.

문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.

단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.

알파벳 이외의 문자들의 무시합니다.


입력

첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.


출력 

첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.


예시 입력 1 

found7, time: study; Yduts; emit, 7Dnuof


예시 출력 1

YES



 



해결

 

1-7 회문 문자열 문제와 비슷한 유형의 문제이다.

이 문제의 키포인트는 알파벳 이외의 문자들은 무시한다는 점이다.
알파벳 이외의 문자들을 무시하기 위해서 입력받은 문자열들 중 특수문자 및  공백들을 지우기 위해 replaceAll() 함수를 사용했다.

 

  • replaceAll(String regex, String replacement) : regex에 들어간 정규식에 따라서 해당되는 문자열을 replacement로 입력받은 문자열로 대체한다.

 

 

replaceAll은 범용성 넓게 쓰이기 때문에 정규식을 따로 다룬 포스트를 올리겠다.

str = str.toLowerCase().replaceAll("[^a-z]", "");

 

나의 코드중 replaceAll을 쓴 부분을 가져왔다.

regex로 받은 "[^a-z]" 부분은 a-z가 아닌 부분을 의미한다. 대체 문자열로는 "" 을 입력받았으므로, a-z가 아닌 것들을 삭제한다는 것을 의미한다.

 

 

문제를 푼 순서를 말하자면,

 

1. 모두 소문자(대문자도 가능)으로 바꾼다.

 

2. 알파벳을 제외한 문자들을 제거한다.(replaceAll() 사용)

 

3. 거꾸로 뒤집어도 원래 문자열과 같은지 확인(StringBuilder의 reverse() 사용)



CODE



import java.util.*;

public class Main {
    public static String solution(String str){
        String answer = "NO";
        str = str.toLowerCase().replaceAll("[^a-z]", "");
        String tmp  = new StringBuilder(str).reverse().toString();
        if(str.equals(tmp)) answer = "YES";

        return answer;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        System.out.println(solution(str));
    }
}


 

 


결과

 

 


문제를 봤을때는 조금은 막막하게 느껴졌지만, replaceAll()을 떠올리고 나니 쉽게 풀 수 있었다.