백준-17609

Rivelog·2023년 10월 22일
0

코딩 테스트

목록 보기
3/11

문제

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

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

입력 예제

7
abba
summuus
xabba
xabbay
comcom
comwwmoc
comwwtmoc

출력 예제

0
1
1
2
2
0
1

풀이

투 포인터를 이용해서 입력 값의 양끝 값을 비교한다.
두 개의 포인터 값이 같으면, 포인터의 위치를 중앙에 인접하게 한 칸 옮긴다.
위 과정을 반복하여 포인터가 만나면 0을 출력한다.

포인터의 값이 달라진 경우 왼쪽 포인터의 값을 바꿨을 때와 오른 쪽 포인터를 바꿨을 때 회문이 될 수 있는 경우의 수를 찾아내고, 회문이 된다면 1을 출력
그래도 회문이 되지 않는다면 2를 출력

위의 방법을 재귀함수로 만들어서 왼쪽의 포인터를 없앤 경우와 오른 쪽 포인터를 없앴을 때 나오는 결과중 최소값을 출력하면 원하는 값을 얻을 수 있다.

Ex)

    s(start) u m m u u s(end) res = 0
    u(start) m m u u(end) res = 0
    m(start) m  u(end) res = 1 회문이 안되는 경우 값은 최소 1이된다.
    m m  / m u 두가지 경우를 다시 함수에 넣어서 값을 확인한다.
     m m res = 1
     m u res = 2
    
  최소값을 갖는 경우를 찾고 res를 반환한다.
import java.io.*;

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        int answer;
        String[] words = new String[T];
        for (int i = 0; i < T; i++) {
            words[i] = br.readLine();
        }// 입력
        for (String word : words) {
            answer = palindrome(word,0, word.length()-1,0);
            System.out.println(answer);
        } // 출력
    }

    public static int palindrome(String word, int start, int end, int res) {
        if(res == 2) return res; // 무한 루프 탈출 조건
        while (start < end) { //투 포인터
            if (word.charAt(start) == word.charAt(end)) {
                start++;
                end--;
            } else {
                // 두 가지 경우 각각을 따로 처리
                return Math.min(
                        palindrome(word, start + 1, end, res+1),
                        palindrome(word, start, end - 1, res+1)
                ); // 재귀 함수
            }
        }
        return res;
    }

}
profile
Just Do It

0개의 댓글