반응형
설명
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.
알파벳 이외의 문자들의 무시합니다.
입력
첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.
출력
첫 번째 줄에 팰린드롬인지의 결과를 YES 또는 NO로 출력합니다.
예시 입력 1
found7, time: study; Yduts; emit, 7Dnuof
예시 출력 1
YES
replaceAll과 leftIndex, rightIndex를 이용한 방법
해당 문제에서는 알파벳 이외의 문자들은 무시해야 한다는 전제 조건이 있다.
replaceAll("정규표현식", "치환할 문자")를 사용해서 알파벳 이외의 값들을 공백("")으로 만들어 줬다.
[^a-zA-Z] 는 a-zA-Z 즉 알파벳이 아닌 문자들을 말한다.
[] 대괄호는 문자들을 집합을 말한다. a-z와 같이 범위지정으로 문자들을 묶을수도 있다.
^ 는 처음이라는 메타문자이기도 하지만, 대괄호 안에서 [^] 사용하면 부정형(not)으로 사용이 가능하다.
package section01.E08_유효한_팰린드롬;
import java.io.*;
public class Main {
public String solution(String words){
// 입력 : words >= 100 공백이 없는 문자열
// 출력 : 팰린드롬이면 "YES" else "NO"
// 1. 알파벳 이외의 문자들은 replaceAll로 "" 치환
// 2. while leftIndex와 rightIndex로 비교하면서 일치하지 않으면 return "NO"
String answer = "YES";
String lowerWord = words.toLowerCase();
String onlyAlphaBetWord = lowerWord.replaceAll("[^a-zA-Z]", "");
int leftIndex = 0, rightIndex = onlyAlphaBetWord.length() - 1;
while (leftIndex < rightIndex){
if (onlyAlphaBetWord.charAt(leftIndex) != onlyAlphaBetWord.charAt(rightIndex)){
answer = "NO";
break;
}
leftIndex++;
rightIndex--;
}
return answer;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String words = br.readLine();
bw.write(T.solution(words));
bw.flush();
bw.close();
}
}
StringBuilder를 통한 해결방법
알파벳이 아닌 문자를 처리하는 replaceAll()은 동일하다.
앞선 회문문자열 문제에서와 동일한 방식으로 StringBuilder.reverse()와 equalsIgnoreCase()로 해결이 가능하다.
package section01.E08_유효한_팰린드롬;
import java.io.*;
public class Main_StringBuilder {
public String solution(String words){
String answer = "YES";
String onlyAlphaBetWord = words.replaceAll("[^a-zA-Z]", "");
String reversedWord = new StringBuilder(onlyAlphaBetWord).reverse().toString();
if (!onlyAlphaBetWord.equalsIgnoreCase(reversedWord)){
answer = "NO";
}
return answer;
}
}
반응형