알고리즘/JAVA

Two Pointers: 백준 회문-17609

문괜 2024. 8. 9. 12:00
반응형

문제 유형: Two Pointers

회문

회문(回文) 또는 팰린드롬(palindrome)은 앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열을 말한다. 예를 들어 ‘abba’ ‘kayak’, ‘reviver’, ‘madam’은 모두 회문이다. 만일 그 자체는 회문이 아니지만 한 문자를 삭제하여 회문으로 만들 수 있는 문자열이라면 우리는 이런 문자열을 “유사회문”(pseudo palindrome)이라고 부른다. 예를 들어 ‘summuus’는 5번째나 혹은 6번째 문자 ‘u’를 제거하여 ‘summus’인 회문이 되므로 유사회문이다.

여러분은 제시된 문자열을 분석하여 그것이 그 자체로 회문인지, 또는 한 문자를 삭제하면 회문이 되는 “유사회문”인지, 아니면 회문이나 유사회문도 아닌 일반 문자열인지를 판단해야 한다. 만일 문자열 그 자체로 회문이면 0, 유사회문이면 1, 그 외는 2를 출력해야 한다.

작성 코드

import java.util.Scanner;

public class Main {

    public static boolean isPalindrome(String givenString, int left, int right) {
        while (left <= right) {
            if (givenString.charAt(left) != givenString.charAt(right)) return false;
            left++;
            right--;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        for (int i = 0; i < N; i++) {
            int answer = 0;
            String givenString = sc.next();
            int left = 0, right = givenString.length() - 1;
            while (left <= right) {
                if (givenString.charAt(left) != givenString.charAt(right)) {
                    if (isPalindrome(givenString, left + 1, right) ||
                            isPalindrome(givenString, left, right - 1)
                    ) {
                        answer = 1;
                    } else {
                        answer = 2;
                    }
                    break;
                }
                left++;
                right--;
            }
            System.out.println(answer);
        }
    }
}

접근 방식

1. 두개의 인덱스 비교와 움직이는 조건이 있어 투포인터를 사용했다. 

2. 끝이다.

개선 사항

1. 좀 더 코드를 간결하게 짤 수 있을지 고민해볼 필요가 있다. 

2. 왜냐 회문을 구분하는 부분에서 아슬아슬하게 통과를 했다.

반응형