알고리즘/백준

백준 17609 - (python)회문

www.acmicpc.net/problem/17609

 

17609번: 회문

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

www.acmicpc.net

 

1. 알고리즘 유형

투포인터

 

2. 자료구조

x

 

3. 풀이

 

회문판단

1) 문자열 왼쪽끝, 오른쪽끝 인덱스 잡고 비교

2) 왼쪽끝과 오른쪽끝이 같아지거나, 크로스 될때까지 문자비교

3) 만약 다르다면 유사회문일 수도 있음, 이상없으면 회문

 

유사회문 판단

1) 왼쪽 인덱스를 한칸 넘겨서 회문인지 판단

2) 오른쪽 인덱스를 한칸 넘겨서 회문인지 판단

3) 1, 2 과정이 둘다 아닌 경우 2를 리턴(아무런 회문이 아니다)

 

회문과 유사회문 판단은 코드 중복이 많으므로 재귀를 사용하여 판단.

type 파라미터를 통해 유사회문 판단인지 회문판단인지 구별

 

코드.

def check(left, right, type):
    ret = type
    while( left < right ):
        if str[left] != str[right] and type == 0:
            a = check(left+1, right, type+1)
            b = check(left, right-1, type+1)
            ret = min(a, b)
            return ret
        elif str[left] != str[right] and type == 1:
            return 2
        else:
            left += 1
            right -= 1
    return ret



N = int(input())
for _ in range(N):
    str = input()
    print(check(0, len(str)-1, 0))

'알고리즘 > 백준' 카테고리의 다른 글

백준 15810 - 풍선 공장  (0) 2021.05.18
백준 2910 - (python)빈도 정렬  (0) 2021.05.01
백준 13901 - (python) 로봇  (0) 2021.04.28
백준 3190 - (python) 뱀  (0) 2021.04.27
20055 - [Java]컨베이어 벨트 위의 로봇  (0) 2021.04.21