본문 바로가기

코딩테스트

[백준] 17609번 : 회문 - 파이썬

17609번

아이디어 : 구현, 문자열, 두 포인터, 함수

문제 해결 과정

1. 양 끝에서 대칭으로 문자열을 비교한다.

2. 문자가 다르면, 한번 더 대칭으로 문자열을 비교한다. (문자열이 모두 같으면 회문 "0")

    2-1. 오른쪽 인덱스 한칸 건너띄고 비교

    2-2. 왼쪽 인덱스 한칸 건너띄고 비교

3. 이전 단계 2-1, 2-2 를 수행했을 때, 문자열이 모두 같으면 유사회문 "1", 다른 경우가 있으면 "2"

 

나의 답안

import sys
input = sys.stdin.readline
T = int(input().strip())

def strCheck(str, l, r):
    while l <= r: 
        if str[l] != str[r]:
            return False
        l += 1
        r -= 1
    return True

while T:
    T -= 1
    str = input().strip()
    L_index = 0
    R_index = len(str) - 1
    fail_count = 0

    while L_index <= R_index:
        # one fail
        if str[L_index] != str[R_index]:
            R_check = strCheck(str, L_index, R_index - 1)
            L_check = strCheck(str, L_index + 1, R_index)

            # two fail check
            if L_check or R_check:
                fail_count = 1
            else:
                fail_count = 2
            break

        L_index += 1
        R_index -= 1

    print(fail_count)

추가

처음에는 메인 로직에 유사회문 비교 알고리즘을 작성하였다.

이후, def strCheck 함수를 만들었더니, 훨씬 간결하고 직관적인 코드를 작성할 수 있었다.

앞으로 중복되는 서브 로직은 def 함수를 만들어서 구현하자!

 

https://www.acmicpc.net/problem/17609

 

17609번: 회문

각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

www.acmicpc.net