회문(백준 17609번)
💡 **Check Point !
( 해당사항 ✓체크 )
막힘 없이 수월하게 풀린 문제인가?
1시간이내로 풀렸던 문제인가?
1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
시간을 써도 도무지 풀 수 없는 문제인가?
솔루션을 찾아봤는가?✓
난이도 체감
최상
상✓
중
하
이해도
완벽히 이해✓
다소 헷갈리는 부분들이 있음
이해 못함
문제
회문(回文) 또는 팰린드롬(palindrome)은 앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열을 말한다. 예를 들어 ‘abba’ ‘kayak’, ‘reviver’, ‘madam’은 모두 회문이다. 만일 그 자체는 회문이 아니지만 한 문자를 삭제하여 회문으로 만들 수 있는 문자열이라면 우리는 이런 문자열을 “유사회문”(pseudo palindrome)이라고 부른다. 예를 들어 ‘summuus’는 5번째나 혹은 6번째 문자 ‘u’를 제거하여 ‘summus’인 회문이 되므로 유사회문이다.
여러분은 제시된 문자열을 분석하여 그것이 그 자체로 회문인지, 또는 한 문자를 삭제하면 회문이 되는 “유사회문”인지, 아니면 회문이나 유사회문도 아닌 일반 문자열인지를 판단해야 한다. 만일 문자열 그 자체로 회문이면 0, 유사회문이면 1, 그 외는 2를 출력해야 한다.
나의 풀이(정답 참고)
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.