본문 바로가기

[Algorithm] 회문 문자열

@xuv22025. 2. 16. 11:45
설명

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

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

단 회문을 검사할 때 대소문자를 구분하지 않습니다.

입력 

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

출력 

첫 번째 줄에 회문 문자열인지의 결과를 YES 또는 NO로 출력합니다.

예시 입력 1 

gooG

예시 출력 1

YES

 


Solution 1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class String7 {

    public static String Solution(String str) {
        String answer = "YES";

        String upperCase = str.toUpperCase();
        StringBuilder sb = new StringBuilder(upperCase).reverse();

        if (!upperCase.equals(sb.toString())) {
            answer = "NO";
        }

        return answer;
    }


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        br.close();

        System.out.println(Solution(str));
    }
}

1. 가장 직관적이고 이해하기 쉽도록 대문자 변환 -> StringBulider 패턴으로 비교

2. 읽고 이해하기 쉽지만 Builder 특성상 메모리 사용량이 높다. 그래서 직접 비교하는 방법으로 해결해도 됨 (대략 O(N) 정도)


Solution 2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Builder 패턴으로 풀어도 되지만 입력 글자를 2로 나눈 몫만큼만 반복문을 수행하는 방식을 택해도 된다 -> for(i < length / 2)
 * 위 는 짝수 기준이지만, 홀수 스트링도 어차피 가운데 글자가 반환점이 되기떄문에 똑같이 풀어주면 된다
 */

public class String7_2 {

    public static String Solution(String str) {
        str = str.toUpperCase();
        String answer = "YES";
        int len = str.length();

        for (int i = 0; i < len / 2; i++) {
            if (str.charAt(i) != str.charAt(len - i - 1)) { // 인덱스 비교 공식 주의
                return "NO";
            }
        }

        return answer;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        br.close();

        System.out.println(Solution(str));
    }
}

1. 코드에 주석으로 적어 놨지만, 아래 내용을 유의하여 구현하면 된다

Builder 패턴으로 풀어도 되지만 입력 글자를 2로 나눈 몫만큼만 반복문을 수행하는 방식을 택해도 된다 -> for(i < length / 2)
위 내용은 짝수 기준이지만, 홀수 스트링도 어차피 가운데 글자가 반환점이 되기떄문에 똑같이 풀어주면 된다

 

2. 메모리 관련에서 효율적이지만, 인덱스를 잘못 지정해주면 오류 찾기 힘듦(대략 O(N/2) 정도)


xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차