문제
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "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()을 떠올리고 나니 쉽게 풀 수 있었다.
'문제 풀이 > 인프런' 카테고리의 다른 글
[JAVA11/알고리즘]1-12 암호 (0) | 2022.08.08 |
---|---|
[JAVA11/알고리즘]1-10 가장 짧은 문자거리 (1) | 2022.08.04 |
[JAVA11/알고리즘]1-7 회문 문자열 (0) | 2022.08.02 |
[JAVA11/알고리즘]1-6 중복 문자 제거 (0) | 2022.08.02 |
[JAVA11/알고리즘] 1-5 특정 문자 뒤집기 (1) | 2022.07.31 |