[BOJ-#15927] 회문은 회문 아니야!!

신지·2022년 8월 26일
0

BOJ

목록 보기
1/15
post-thumbnail

문제

팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다.

같은 의미를 가지는 여러 단어들을 보자.

회문 (한국어)
palindrome (영어, 프랑스어, 노르웨이어, 그리스어, 라틴어)
回文 (일본어, 중국어)
palindrom (독일어, 덴마크어)
palindromi (핀란드어)
palíndromo (스페인어, 포르투갈어)
palindromo (이탈리아어, 에스페란토어)
палиндром (러시아어)
قلب مستو (아랍어)
뭔가 이상한 점이 보이지 않는가? 그 어떤 언어에서도 팰린드롬을 뜻하는 단어는 팰린드롬이 아니다! 많은 사람들이 추구하는 “대칭의 아름다움”은 그저 허상에 불과하다.

알파벳 대문자로 이루어진 문자열이 주어졌을 때, 팰린드롬이 아닌 가장 긴 부분문자열의 길이를 구해 보자. 이때 부분문자열을 이루는 글자는 연속해야 한다. AB는 ABCD의 부분문자열이지만, AC는 아니다.

Code

import sys

input = sys.stdin.readline

pal = input().strip()

check = False
for i in range(len(pal)) :
    if pal[i] == pal[0] :
        check = True
    else : 
        check = False
        break

if check == True or len(pal) == 1 :
    print(-1)
elif pal == pal[::-1] :
    print(len(pal)-1)
else :
    print(len(pal))

코드 설명

import sys

input = sys.stdin.readline

pal = input().strip()

요새 백준을 풀면서 생긴 습관인데... 빠른 입력을 받기 위해 습관적으로 sys를 import 해 준다. 하지만 매번 sys.stdin.readline()를 입력하는 건 귀찮기 때문에 input = sys.stdin.readline이라고 정의해 준다. 물론 빠른 입력을 불러와도 안 풀리는 문제가 많아서... 그건 그냥 내 알고리즘의 문제겠지요... sys를 불러온 후 문자열을 받아오는데, 이때 strip()를 통해 sys에 의해 생긴 \n을 제거해 준다. 사실 문자열 하나만 받아올 땐 필요 없긴 하지만 얘도 습관이 들었다...

check = False
for i in range(len(pal)) :
    if pal[i] == pal[0] :
        check = True
    else : 
        check = False
        break

문제의 조건 중, 팰린드롬이 아닌 가장 긴 부분문자열이 없으면 '-1'을 출력해야 하므로 확인해 준다. 만약 문자열이 모두 같은 문자로 이루어져 있다면 팰린드롬이 아닐 수 없으므로, check = False로 두고 다른 0번째 인덱스의 문자열과 하나라도 다른 문자열이 있다면 check가 계속해서 False이도록 코드를 작성해 준다. 이때 나는 문자열이 모두 같은 문자로 이루어져 있다면 True, 아니라면 False가 되도록 코드를 작성했다.

if check == True or len(pal) == 1 :
    print(-1)
elif pal == pal[::-1] :
    print(len(pal)-1)
else :
    print(len(pal))

만약 check가 True거나 문자열의 길이가 1이라면 팰린드롬이 아닌 부분문자열은 없으므로 -1을 출력해 준다. 그 다음에 [::-1]을 사용하여 문자열을 뒤집어 문자열이 팰린드롬인지 확인한다. 팰린드롬일 경우 한 글자만 제거하면 팰린드롬이 아닌 문자열이 되므로 문자열 길이에서 1을 빼주고, 아닐 경우 문자열의 길이를 그대로 출력한다.

리뷰

언니들이랑 백준 풀면서 진짜 미묘하고 적지만... 알고리즘 실력이 는 것 같아서 다행이다. 내 풀이가 가장 정석적인 풀이인지는 모르겠지만, 나는 사실 모든 문자열이 같을 때 -1을 출력하는 부분에서 조금 애를 먹었다. 처음으로 푸는 골드 문제라 지레 겁을 먹고 어렵게 풀이하려고 한 것도 있었다... 그러나 자고 일어나서 '그냥 0번째 인덱스랑 처음부터 마지막 문자가 같은지 확인하면 되는 거 아닌가?...'라는 생각이 들어 풀이할 수 있게 되었다. 제발 2학년 올라가기 전에는 내가 백준 골드가 되어 있길 바란다.

0개의 댓글