algorithm

유효한 팰린드롬

juuuuuuun 2024. 4. 28. 19:15

설명

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

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

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

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

 

입력

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

 

출력

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

 

예시 입력 1 

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

 

예시 출력 1

YES

 

소스코드 1

import java.util.Scanner;

public class Main{

    public static String solution(String str) {
        String answer = "YES";
        //1. 단어별로 쪼개기
        String[] words = str.split("\\s+");
        String[] wordsArr = new String[words.length];


        //2. 만약 단어의 개수가 6개라면 포문으로 1~3까지 돌려서 1-6 2-5 3-4 와 같은 식으로 비교하기
        //2에서 비교할 때 알파벳 이외의 문자는 다 무시할 것 ex)숫자, 특수문자
        for (int i = 0; i < words.length / 2; i++) {

            //알파벳만 뽑아서 wordsArr에 단어별로 배열에 저장
            for (int j = 0; j < words[i].length(); j++) { //words[i].length()는 단어 길이
                if ('A' <= words[i].charAt(j) && words[i].charAt(j) <= 'z') {
                    wordsArr[i] += words[i].charAt(j);
                }
            }

            for (int j = words[words.length - i - 1].length() - 1; j >= 0; j--) {

                if ('A' <= words[words.length - i - 1].charAt(j) && words[words.length - i - 1].charAt(j) <= 'z') {
                    wordsArr[wordsArr.length - i - 1] += words[words.length - i - 1].charAt(j);
                }
            }


            //대소문자 구분 없이 비교
            if (!wordsArr[i].equalsIgnoreCase(wordsArr[words.length - i - 1])) {
                answer = "NO";
            }

        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine(); //문자열 입력
        System.out.println(solution(str));
    }
}

 

 

소스코드 2

import java.util.Scanner;

public class Main {
    public static String solution(String s) {
        String answer = "YES";
        s = s.toUpperCase().replaceAll("[^A-Z]",""); //대문자로 바꾸기, A-Z가 아니면 빈 문자로 출력하라
        String str2 = new StringBuilder(s).reverse().toString();
        for (int i = 0; i < s.length(); i++) {
            if (str2.charAt(i) != s.charAt(i)) {
                return "NO";
            }
        }


        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));
    }
}

 

 

replaceAll()

 - 문자열에서 특정 패턴을 찾아 다른 문자열로 대체한다.

 - 첫 번째 매개변수는 반환하고자 하는 대상이 될 문자열 또는 정규 표현식

 - 두 번째 매개변수는 변환할 문자 값

 - 아래의 출력 결과는 "Hi World Hi Jun 이 된다.

String str = "Hello World Hello Jun";
String rep = str.replaceAll("Hello","Hi");

 

- 첫 번째 매개변수에 정규 표현식을 사용할 수도 있다.

 - 아래의 출력 결과는 "H*ll* W*rld H*ll* J*n 이 된다.

String str = "Hello World Hello Jun";
String rep = str.replaceAll("[aeiou]","*");

 

 - replace()와의 차이점으로는 replace는 정규표현식을 지원하지 않고 단순 문자열 치환에만 사용되며, replaceAll() 정규표현식을 사용하여 문자열을 치환하며, 더 다양한 패턴을 처리할 수 있다.