🤔 나의 풀이
📌 문제
- 파이썬 알고리즘 인터뷰 6번 문제
- 가장 긴 팰린드롬(회문) 부분 문자열을 출력하시오.
📌 날짜
2020.01.16
📌 시도 횟수
1 try
💡 Code
class Solution:
def longestPalindrome(self, s: str) -> str:
for i in range(len(s)):
for j in range(i + 1):
if self.isPalindrome(s[j : len(s) - i + j]):
return s[j : len(s) - i + j]
def isPalindrome(self, s):
return s[:] == s[::-1]
💡 문제 해결 방법
- 가장 긴 팰린드롬 문자열을 추출하는 것이므로 문자열의 최대 길이 부분 문자열부터 시작했다.
- 가장 긴(전체) 문자열부터 시작해 문자열의 길이를 1개씩 줄여가며 팰린드롬임을 판별한다.
- 만약 가장 먼저 팰린드롬이 참이 되면 프로그램을 종료하고 해당 문자열을 return 한다.
*문자열의 길이 한 개씩 줄이는 방법
- 예를들어 길이가 5인 문자열이 있을 때 위의 사진처럼 범위를 조정할 수 있다.
- 문자열의 인덱스가 (0~4 → 0~3,1~4 → 0~2,1~3,2~4 → ...)임을 보고 인덱스 간의 규칙을 찾아냈다.
⊙ 바깥 for문의 i는 0 ~ len(s)-1까지의 값을 가지고,
⊙ 안쪽 for문의 j는 0 ~ i 까지의 값을 갖는다.
⊙ 따라서 위 i, j에 대하여 문자열의 인덱스는 (j ~ len(s)-1-i+j)의 범위를 가진다.
⊙ 즉 이를 문자열 슬라이싱으로 나타내면 s[j : len(s) - i + j] 이다.
💡 새롭게 알게 된 점
-
❌ (한번에 맞추지 못한 경우) 오답의 원인
-
😉 다른 풀이
📌 하나. 투 포인터가 중앙을 중심으로 확장하는 형태
class Solution:
def longestPalindrome(self, s: str) -> str:
def expand(left: int, right: int) -> str:
while left >= 0 and right <= len(s) and s[left] == s[right - 1]:
left -= 1
right += 1
return s[left + 1 : right - 1]
if len(s) < 2 and s == s[::-1]:
return s
result = ""
for i in range(len(s) - 1):
result = max(result, expand(i, i + 1), expand(i, i + 2), key=len)
return result
💡 새롭게 알게 된 점
✔ 기본형 : max(iterable)
- 매개변수 : 반복이 가능한 자료형
- 반환형 : 매개변수로 들어온 인자 내부에서 제일 큰 값을 반환한다.
✔ 응용형 : max(iterable1, iterable2, ...)
- 매개변수 : 반복이 가능한 자료형`들`
- 반환형 : 매개변수로 들어온 반복이 가능한 인자들 중에 가장 큰 인자(덩어리)을 반환한다.
여기서 반환형은 iterable1내부에 가장 작은 값이 아니라, iterable1 과 iterable2 중 큰 것을 반환한다.
- key를 지정해줄 수 있다. (예를 들어서 (key = len)으로 설정하면 길이를 기준으로 최댓값을 반환한다.)
✔ 투 포인터가 아직은 익숙하지 않은데 앞으로는 이 방법도 구현하기 전에 한번쯤 고려하도록 노력해야겠다~!