AKARAKA(아카라카)는 컴퓨터 과학적 관점으로 바라봤을 때, 튜링도 기립 박수를 치고 갈 가히 최고의 구호라 할 수 있다. AKARAKA는 그 자체로도 팰린드롬이고, 접두사이자 접미사인 AKA가 또한 팰린드롬이기 때문이다.
신촌에서는 AKARAKA같은 특성을 가진 팰린드롬을, 아카라카 팰린드롬이라 아래와 같이 정의한다.
문자열 S가 팰린드롬이다. 팰린드롬이란 거꾸로 뒤집어 읽어도 같은 문자열을 뜻한다.
문자열 S의 길이를 |S|라 할 때,
$\lfloor\frac{|S|}{2}\rfloor$ 길이의 접두사와 접미사가 모두 아카라카 팰린드롬이다. 만약
|S| = 1이면,
S는 아카라카 팰린드롬이다.
임의의 문자열이 주어졌을 때, 그 문자열이 아카라카 팰린드롬인지 알아보자. 만약 알아내지 못하면, 졸업할 때까지 아카라카를 못 갈지도 모른다!
입력
알파벳 소문자로 이루어진 문자열
S가 주어진다. (1 <= |S| <= 2000000)
출력
주어진 문자열
S가 아카라카 팰린드롬이라면, AKARAKA를 출력한다.
만약 그렇지 않다면, IPSELENTI를 출력한다.
import sys
S = sys.stdin.readline().strip()
## 아카라카 팰린드롬인지 아닌지 확인하는 함수
## 재귀적으로 들어가서 prefix와 suffix가 각각 아카라카 팰린드롬인지 확인하기
def check (S):
## S의 길이가 1이면 아카라카 팰린드롬
if len(S) == 1:
return True
prefix = S[:len(S) // 2]
suffix = S[len(S) // 2:] if len(S) % 2 == 0 else S[len(S) // 2 + 1:]
## 만약에 아카라카 팰린드롬이라면, prefix와 suffix도 팰린드롬인지 확인하기
if S == S[::-1] and prefix == prefix[::-1] and suffix == suffix[::-1]:
return check(prefix) and check(suffix)
## 만약에 아카라카 팰린드롬이 아니면, 바로 False를 출력하기
else:
return False
if check(S):
print('AKARAKA')
else:
print('IPSELENTI')
다음 문자열들은 '아카라카 팰린드롬'이 아니다.
WA를 받았다면 아래 예시에서 잘못된 답을 출력하고 있을 것으로 예상된다.
'abcbaabcba'
'abcdcbaabcdcba'
'abba'
abcbaabcba의 경우 abcba라는 펠린드롬 접미/접두사를 가지고 있긴하지만, abcba는 아카라카펠린드롬은 아니네요
아카라카펠린드롬은 접미/접두사도 아카라카여야한다고 나와있네요
import sys
S = sys.stdin.readline().strip()
if len(S) == 1:
print('AKARAKA')
else:
prefix = S[:len(S) // 2]
suffix = S[len(S) // 2:] if len(S) % 2 == 0 else S[len(S) // 2 + 1:]
if S == S[::-1] and prefix == prefix [::-1] and suffix == suffix [::-1] :
print('AKARAKA')
else:
print('IPSELENTI')
테스트 케이스만으로 문제를 이해하는 것이 아니라, 문제를 잘 이해해서 히든 테스트 케이스도 풀 수 있는지 확인하는 꼼꼼함이 필요하다!