개발 공부~

[문자열] 유효한 팰린드롬 .java 본문

코딩테스트/기타

[문자열] 유효한 팰린드롬 .java

머밍 2024. 9. 23. 15:04

 

설명

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

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

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

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

입력

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

출력

첫 번째 줄에 팰린드롬인지의 결과를 YES 또는 NO로 출력합니다.

예시 입력 1 

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

예시 출력 1

YES

 

 

 

내 풀이

알파벳만 따로 저장한 문자열을 만들고 이를 회문 검사하는 방식으로 구현하였다.

 

1. 알파벳만 검사 -> Character.isAlphabetic() 으로 검사

2. 대소문자를 구분하지 않기 때문에 다 소문자로 바꿔 tmp 문자열에 하나씩 저장

3. tmp문자열을 lt, rt로 돌면서 회문 검사

 

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();
        String tmp = "";
        for(int i = 0; i < str.length(); i++){
            if(Character.isAlphabetic(str.charAt(i))){
                tmp += Character.toLowerCase(str.charAt(i));
            }
        }
        char[] chars = tmp.toCharArray();

        int lt = 0;
        int rt = chars.length - 1;
        boolean isPalindrome = true;
        while (lt < rt) {
            if (chars[lt] != chars[rt]) {
                isPalindrome = false;
                break;
            }
            lt++;
            rt--;
        }
        if (isPalindrome) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

    }
}

 

 

다른 풀이

replaceAll("[^A-Z]", "")

 

[]: 대괄호 안의 문자들의 범위에 속하는 것을 의미

^: 대괄호 안의 ^는 부정을 의미

=> 대문자 A-Z까지가 아니면 빈문자로 대체하라

 

정규식 참고 글

https://better21.tistory.com/126

 

[자바] replaceAll("정규식","대체문자")

replaceAll("정규식","대체문자") 문자열 내에서 특정 패턴을 찾아 다른 문자열로 대체하는 데 사용첫 번째 인수는 정규식(Regular Expression), 두 번째 인수는 대체할 문자열  1. . (dot)-> 모든 문자-> 예:

better21.tistory.com


import java.util.Scanner;

public class Main {
    public String solution(String s){
        String answer = "NO";
        //알파벳만 있도록 정규식으로
        s = s.toUpperCase().replaceAll("[^A-Z]", "");
        //문자열 s를 거꾸로 뒤집은 문자열 tmp
        String tmp = new StringBuilder(s).reverse().toString();
        //두 문자열이 같으면 회문
        if(s.equals(tmp)) answer = "YES";
        return answer;
    }
    public static void main(String[] args)  {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(T.solution(str));
    }


}

 

 

💡

회문은 투포인터로 검사하는 것이 익숙해서 다른 방법을 생각안했는데 스트링빌더의 리벌스를 이용하는 게 더 간편한 문제였다.

또한 하나하나 검사할 필요없이 알파벳이 아닌 문자를 빈문자로 바꾸는 것을 생각하지 못해 신기했다

정규식이 익숙해지면 for문보다 훨씬 편할 것 같다

아직 부족하니 다른 문제도 for문보다 정규식으로 대체할 수 있는 문제인지 먼저 고려해야겠다