본문 바로가기
Java/Coding-Test

[Java] 1-8 유효한 팰린드롬

by JS1111 2022. 1. 15.

문제

앞에서 읽을 때나 뒤에서 읽을 때나 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 "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

댓글