[Java, Python]_17609_팰린드롬

hanseungjune·2023년 7월 20일
0

알고리즘

목록 보기
31/33
post-thumbnail

자바

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

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

        int n = Integer.parseInt(br.readLine());

        for (int t = 0; t < n; t++) {
            String compare = br.readLine();
            int left = 0, right = compare.length() - 1;
            while (left < right) {
                if (compare.charAt(left) != compare.charAt(right)) {
                    StringBuilder sb1 = new StringBuilder(compare);
                    StringBuilder sb2 = new StringBuilder(compare);
                    if (isPalindrome(sb1.deleteCharAt(left).toString())) {
                        System.out.println(1);
                        break;
                    }
                    if (isPalindrome(sb2.deleteCharAt(right).toString())) {
                        System.out.println(1);
                        break;
                    }
                    System.out.println(2);
                    break;
                }
                left++;
                right--;
            }
            if (left >= right) {
                System.out.println(0);
            }
        }
    }

    public static boolean isPalindrome(String s) {
        return new StringBuilder(s).reverse().toString().equals(s);
    }
}

로직

이 Java 코드는 주어진 문자열이 회문(앞뒤가 똑같은 문자열)인지, 유사 회문(한 문자를 제거해서 회문이 되는 문자열)인지, 아니면 둘 다 아닌지 판단하는 문제를 해결합니다.

주요 구성 요소는 다음과 같습니다:

isPalindrome: 주어진 문자열 s가 회문인지 확인하는 함수입니다. 문자열 s를 뒤집은 것과 원래의 문자열 s가 같다면 s는 회문이므로 true를 반환하고, 그렇지 않다면 false를 반환합니다.

main: 사용자로부터 테스트할 문자열의 개수 n과 n개의 문자열을 입력받습니다. 각 문자열에 대해 다음을 수행합니다:

문자열의 양 끝에서 시작해서 중앙까지 이동하면서, 같은 위치에 있는 두 문자가 같은지 확인합니다. 만약 같지 않다면, 한 쪽 문자를 제거한 후 남은 문자열이 회문인지 확인합니다.
만약 왼쪽 문자를 제거한 후의 문자열이 회문이라면 '1'을 출력하고 현재의 문자열에 대한 처리를 중단합니다.
만약 오른쪽 문자를 제거한 후의 문자열이 회문이라면 '1'을 출력하고 현재의 문자열에 대한 처리를 중단합니다.
만약 두 경우 모두 회문이 아니라면 '2'를 출력하고 현재의 문자열에 대한 처리를 중단합니다.
만약 모든 문자들이 서로 같았다면(즉, 원래의 문자열이 회문이었다면) '0'을 출력합니다.
이 코드를 간략하게 요약하면, 주어진 문자열이 회문인지, 유사 회문인지, 아니면 둘 다 아닌지 판단하는 문제를 해결하는 것입니다. 이를 위해 문자열의 양 끝에서 시작해서 중앙까지 이동하면서 두 문자가 같은지 확인하고, 만약 같지 않다면 한 쪽 문자를 제거한 후 남은 문자열이 회문인지 확인합니다.

파이썬

import sys
input = sys.stdin.readline

n = int(input())

def is_palindrome(s):
    return s == s[::-1]

lst = []
for _ in range(n):
    lst.append(list(input().strip()))

for t in range(n):
    compare = lst[t]
    left, right = 0, len(compare)-1
    while left < right:
        if compare[left] != compare[right]:
            one_remove_char = compare[:left] + compare[left+1:]
            if is_palindrome(one_remove_char):
                print(1)
                break
            one_remove_char = compare[:right] + compare[right+1:]
            if is_palindrome(one_remove_char):
                print(1)
                break
            print(2)
            break
        left += 1
        right -= 1
    else:
        print(0)
profile
필요하다면 공부하는 개발자, 한승준

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기