본문 바로가기
  • Hi Hello, Code
🧑‍💻Problem Solutions/LeetCode

#917. Reverse Only Letters (Python/파이썬)

by 밍구링구링 2023. 10. 10.

📖Problem: #917. reverse-only-letters

[LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com](https://leetcode.com/problems/reverse-only-letters/description/)

  • 작성일시: 2023년 10월 8일 오후 1:26
  • 등급: Easy
  • 유형: 스택/큐

Leetcode #917.

문자열 s가 주어지면

  • 영문자가 아니면 모두 같은 위치에 유지
  • 영문자(소문자/대문자)는 모두 뒤집어야 함

🔍Institution

reverse하는 것을 보고 stack이 바로 생각났다.

Flow:

  1. s길이만큼 for문을 반복하여 stack 리스트를 생성하여, 입력 s에 대해 알파벳 값만 push시킨다.
  2. s를 리스트형으로 변환한 값을 StoList 리스트에 저장한다.
  3. StoList길이만큼 for문을 반복하여 알파벳인 경우,알파벳이 아닌 경우 넘어간다.
  4. stack의 값을 pop하여 s에 해당하는 인덱스의 값을 변경하고,
  5. StoListjoin()함수를 이용하여 문자열 형태로 변경한 값을 answer에 저장한다.
  6. answer를 return한다.

🔍Approach

  • Stack

🚩My submission

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        stack = [] 
        for i in s:
            if i.isalpha():
                stack.append(i)
        StoList = list(s)

        for i in range(len(StoList)):
            if StoList[i].isalpha():
                StoList[i] = stack.pop()
        answer = "".join(StoList)

        return answer

🚩Others submission

Two-pointer approach

class Solution(object):
    def reverseOnlyLetters(self, s):
        """
        :type s: str
        :rtype: str
        """
        s = list(s)

        left, right = 0, len(s)-1
        while left < right:
            if s[left].isalpha() and s[right].isalpha():

                s[left], s[right] = s[right], s[left]
                left += 1
                right -= 1
            elif s[left].isalpha() and not s[right].isalpha():
                right -=1
            else:
                left+=1

        return ''.join(s)
  • 문자열을 먼저 리스트 형태로 변환
  • 양쪽 끝(left, right)에 문자가 있는지 확인
    • 문자가 있다면, index를 이용해서 swapping
  • 마지막에 list를 다시 string으로 변환한 후 return
class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        alphabets = [i for i in s if i.isalpha()][-1::-1]
        for i in range(len(s)):
            if not(s[i].isalpha()):
                alphabets.insert(i,s[i])
        alphabets = ''.join(alphabets)
        return alphabets

💡TIL

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        stack = []
        for i in s:
            if i.isalpha():
                stack.append(i)
        for i in range(len(s)):
            if s[i].isalpha():
                s[i] = stack.pop()

이렇게 작성하면 아래와 같은 Runtime Error가 발생한다.

Runtime Error
TypeError: 'str' object does not support item assignment s[i] = stack.pop() Line 10 in reverseOnlyLetters (Solution.py) ret = Solution().reverseOnlyLetters(param_1) Line 31 in _driver (Solution.py) _driver() Line 42 in (Solution.py)

⇒ 즉, string을 list로 바꾸거나 replace()함수 사용해야 한다.

따라서 나는 list로 형변환을 시킨 후, 정답을 다시 string형태로 바꾸는 방식을 선택했다.

  • string에 index로 접근할 수는 있지만 수정은 할 수 없다는 것을 배웠다.
  • 문법
    • 문자.isalpha(): 문자가 알파벳인지 아닌지 True/False형태로 반환
    • list(): 리스트형태로 형변환
    • “바꿀기호”.join(리스트이름): 파이썬 리스트를 문자열로 합치는 함수
a = ["a", "b", "c"]
"".join(a) 
print(a) 
# abc
# 요소 사이에 특정 문자열을 추가하여 문자열로 반환
a = ["a", "b", "c"]
"/".join(a) 
print(a)
# a/b/c
반응형