문제] [유형3] 2번 - 회문 (100점)
모든 언어에 대해 시간 제한 2초, 메모리 제한 512MB입니다.
회문(回文) 또는 팰린드룸(palindrome)은 앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열을 말한다. 예를 들어 'abba', 'kayak', 'reviver', 'madam'은 모두 회문이다. 만일 그 자체는 회문이 아니지만 한 문자를 삭제하여 회문으로 만들 수 있는 문자열이라면 우리는 이런 문자열을 "유사회문"(pseudo palindrome)이라고 부른다. 예를 들어 'summuus'는 5번째나 혹은 6번째 문자'u'를 제거하여 'summus'인 회문이 되므로 유사회문이다.
여러분은 제시된 문자열을 분석하여 그것이 그 자체로 회문인지, 또는 한 문자를 삭제하면 회문이 되는 "유사회문"인지, 아니면 회문이나 유사회문도 아닌 일반 문자열인지를 판단해야 한다. 만일 문자열 그 자체로 회문이면 0, 유사회문이면 1, 그 외는 2를 출력해야 한다.
입력형식]
입력의 첫 줄에는 주어지는 문자열의 개수를 나타내는 정수 T(1 ≤ T ≤ 30)가 주어진다. 다음 줄부터 T개의 줄에 걸쳐 한 줄에 하나의 문자열이 입력으로 주어진다. 주어지는 문자열의 길이는 3이상 100,000이하이고, 영문 알파벳 소문자로만 이루어져 있다.
출력형식]
각 문자열이 회문인지, 유사회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
출처]
2019년 한국정보올림피아드 1차대회 2교시 초등부 pdf
참고풀이]
import sys #exit()
#문자열의 개수를 입력받는다.
N=int(input())
if 1<=N<=30:
#입력한 개수만큼 반복하면서 리스트에 문자열을 입력한다.
sList=[]
for i in range(N):
s=input()
if 3<=len(s)<=100000:
sList.append(s) #문자열을 입력한다.
else:
sys.exit()
for s in sList:
n = len(s) #문자열의 길이를 구한다.
chk = -1#회문여부를 체크한다.
for i in range(n):
if s[i] != s[n-i-1]:
chk = i #회문이 아닌 위치의 값을 넣는다.
break
if chk == -1:
#회문을 표시하는 0을 출력한다.
print("0")
else:
#회문이 아니면 유사회문, 비회문인지 체크한다.
chk2 = n-1-chk
p1 = s[:chk] + s[chk+1:]
p2 = s[:chk2] + s[chk2+1:]
if p1 == p1[::-1] or p2 == p2[::-1]:
print("1") #유사회문을 표시하는 1을 출력한다.
else:
print("2") #비회문을 표시하는 2를 출력한다.
참고풀이 결과]
대한민국의 아름다운 영토, 독도의 봄
'프로그램 > Python 1000제' 카테고리의 다른 글
Python 14제] 조건에 맞는 리스트값을 출력하는 프로그램을 작성하시오. (0) | 2021.08.05 |
---|---|
Python 13제] 7의배수와 3의 배수를 찾아 출력하는 프로그램을 작성하시오. (0) | 2021.08.04 |
Python 11제] 입력한 배수의 개수와 합을 구하는 프로그램을 작성하시오. (0) | 2021.08.02 |
Python 10제] 입력한 정수까지의 3의 배수의 개수와 합을 구하는 프로그램을 작성하시오. (0) | 2021.08.02 |
Python 9제] 로또 당첨 등수를 구하는 프로그램을 작성하시오. (0) | 2021.08.01 |
댓글