Contents
- 문제 설명
[제한사항]
[입출력 예] - 알고리즘 분석
[나의 풀이]
[Most 1 의 풀이]
문제 설명
앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다.
문자열 s가 주어질 때, s의 부분문자열(Substring)중
가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.
예를들면, 문자열 s가 "abcdcba"이면 7을 return하고 "abacde"이면 3을 return합니다.
제한사항
- 문자열 s의 길이 : 2,500 이하의 자연수
- 문자열 s는 알파벳 소문자로만 구성
입출력 예
s | answer |
"abcdcba" | 7 |
"abacde" | 3 |
알고리즘 분석
- 나의 풀이
def solution(s):
answer = 0
s_len = len(s)
for i in range(s_len): # 왼쪽 -> 오른쪽
for j in range(s_len, i, -1): # 오른쪽 -> 왼쪽
temp = s[i:j] # 검사할 문자열의 범위
t_len = len(temp) # temp의 길이
if answer > t_len: # 정답이 temp의 길이보다 크면
continue
for z in range(t_len//2):
x, y = temp[z], temp[-z-1] # temp의 앞에서부터, 뒤에서부터
if x != y: # x 와 y가 다르면
break
else: # for문에서 break가 실행되지 않았다면
answer = j - i # temp의 길이가 정답
return answer
- Most1의 풀이
# 재귀함수를 이용한 풀이
# 현재는 시간초과 발생
def solution(s):
return len(s) if s[::-1] == s else max(solution(s[:-1]), solution(s[1:]))
- Most2의 풀이
# 내 코드와는 달리 큰 길이 -> 작은 길이 순으로 확인했기 때문에 for문을 전부 돌지 않아도
# 정답과 일치하는 결과가 나오면 바로 return할 수 있습니다.
def longest_palindrom(s):
for i in range(len(s),0,-1): # 큰 길이 -> 작은 길이
for j in range(len(s)-i+1):
if s[j:j+i] == s[j:j+i][::-1]: # 팰린드롬이라면
return i
개인적으로 Most2가 더 마음에 드네요.
'프로그래머스(Python) > Level3' 카테고리의 다른 글
[프로그래머스] '멀리뛰기' 알고리즘 풀이 - Python (0) | 2020.11.04 |
---|---|
[카카오 기출문제] '기둥과 보 설치' 문제 풀이 - Python (0) | 2020.11.04 |
[프로그래머스] '순위' 알고리즘 풀이 - Python (0) | 2020.11.03 |
[프로그래머스] '입국심사' 알고리즘 풀이 - Python (0) | 2020.11.02 |
[프로그래머스] '베스트앨범' 알고리즘 풀이 - Python (0) | 2020.10.30 |