문제
앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "YES", 아니면 “NO"를 출력하는 프로그램을 작성하세요.
단 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.
알파벳 이외의 문자들의 무시합니다.
입력
첫 줄에 길이 100을 넘지 않는 공백이 없는 문자열이 주어집니다.
출력
첫 번째 줄에 팰린드롬인지의 결과를 YES 또는 NO로 출력합니다.
예시 입력
found7, time: study; Yduts; emit, 7Dnuof
예시 출력
YES
출처
내 풀이
while문 사용
private static String isPalindrome1(String input) {
char[] chars = input.toLowerCase().toCharArray();
int left = 0;
int right = input.length() - 1;
// 양끝에서 출발하여 둘 다 문자일경우에만 같은지 비교
while(left < right) {
if (!Character.isLetter(chars[left])) {
left++;
continue;
}
if (!Character.isLetter(chars[right])) {
right--;
continue;
}
if(chars[left] != chars[right]) {
return "NO";
} else {
left++;
right--;
}
}
return "YES";
}
첫문자와 마지막문자 양끝에서 출발하여 둘 다 문자인 경우에만 같은지 비교
Stream,StringBuilder 사용
private static String isPalindrome2(String input) {
StringBuilder sb = new StringBuilder();
input.chars()
.filter(Character::isLetter) // 알파벳만 필터링
.forEach(sb::appendCodePoint);
String alphabet = sb.toString();
String alphabet_reversed = sb.reverse().toString();
return alphabet.equalsIgnoreCase(alphabet_reversed)
? "YES"
: "NO";
}
Stream.filter
를 사용하여 알파벳만 필터링
다른 풀이
public String solution(String s){
String answer="NO";
s=s.toUpperCase().replaceAll("[^A-Z]", "");
String tmp=new StringBuilder(s).reverse().toString();
if(s.equals(tmp)) answer="YES";
return answer;
}
정규표현식을 사용하여 알파벳만 필터링
[^A-Z] : 대문자 A~Z가 아닌 모든 문자
기억할 점
StringBuilder.reverse()
는 순수함수가 아님
원본을 수정하기 때문에 호출한 뒤에 주의
StringBuilder sb = new StringBuilder("ABC");
System.out.println(sb.reverse()); // CBA
System.out.println(sb); // CBA
정규표현식 [^A-Z]
: 대문자 A~Z가 아닌 모든 문자
'Java > Coding-Test' 카테고리의 다른 글
[Java] 1-10 가장 짧은 문자거리 (0) | 2022.01.16 |
---|---|
[Java] 1-9 숫자만 추출 (0) | 2022.01.15 |
[Java] 1-7 회문 문자열 (0) | 2022.01.14 |
[Java] 1-6 중복문자제거 (0) | 2022.01.13 |
[Java] 1-3 문장 속 단어 (0) | 2022.01.08 |
댓글