Post
회문(백준 17609번) | Gihun Son

회문(백준 17609번)

💡 **Check Point !

( 해당사항 ✓체크 )

  1. 막힘 없이 수월하게 풀린 문제인가?

  2. 1시간이내로 풀렸던 문제인가?

  3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

  4. 시간을 써도 도무지 풀 수 없는 문제인가?

  5. 솔루션을 찾아봤는가?✓


난이도 체감

  1. 최상

  2. 상✓


이해도

  1. 완벽히 이해✓

  2. 다소 헷갈리는 부분들이 있음

  3. 이해 못함

문제

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

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

Untitled

나의 풀이(정답 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
T=int(input())

for _ in range(T):
    S=sys.stdin.readline().strip()
    left=0
    right=len(S)-1
    answer=0
    while left<right:
        if S[left]==S[right]:
            left+=1
            right-=1
        else:
            tmp_S1=S[:left]+S[left+1:]
            tmp_S2=S[:right]+S[right+1:]
            if tmp_S1==tmp_S1[::-1] or tmp_S2==tmp_S2[::-1]:
                answer=1
                break
            else:
                answer=2
                break
    print(answer)
  • 위 문제는 “투 포인터”를 사용해서 풀이하는 문제이다. 투 포인터가 정확히 어떤 알고리즘인지 몰랐기 때문에 찾아보았다.
  • 투 포인터란
    • Two-Point Algorithm(투 포인터 알고리즘) : 1차원 배열에서 각자 다른 원소를 가리키고 있는 2개의 포인터를 조작해가면서 원하는 값을 찾을 때 까지 탐색하는 알고리즘이다.

    설명: https://velog.io/@heyggun/Algorithm-Two-Pointers-Algorithm-투-포인터-알고리즘

  • 포인터를 양 끝 두개로 놓고, 문자가 같은지 다른지를 비교했다.
  • 만약 문자가 다르다면, 달랐던 문자를 각각 빼고 뒤집은 문자열이 이전과 동일하다면 ‘유사 회문’, 동일하지 않다면 ‘해당 없음’으로 분류하도록 하였다.
This post is licensed under CC BY 4.0 by the author.