본문 바로가기

개인 공부/알고리즘 (공부+문제풀이)

LeetCode (No.125) : Python 문제 풀이

비가 조금씩 내리다가... 그쳤다가... 내리다가... 그쳤다가... 날씨 보고 영국인 줄 알았어요!

영국까지 안 가도 영국 체험할 수 있다니~!

럭키럭키 초럭키입니다~ ^_^

 

날씨가 이상해도 할 일은 해야겠지요.

그래서 오늘 처음으로 LeetCode를 시작해 봤습니다.

 

아 근데 LeetCode에서 제공하는 기본 코드는 PEP(Python Enhancement Proposal)에서 권장하는 Snake Case를 안 쓰더라구요.

다른 언어들과 함께 기본 제공 코드를 일괄 작성해서 그런지 Camel Case를 사용하더라구요.

 

Python 주 사용자라면 약간 신경 쓰일 수도 있는 부분이지만... LeetCode 만의 특징인 것 같아서 적어봤습니다!


 

# 문제 (125. Valid Palindrome) : 문자열, 구현 유형

A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.


Given a string s, return true if it is a palindrome, or false otherwise.

 

 

# 예제

  • Example 1
    • Input : s = "A man, a plan, a canal: Panama"
    • Output : true
    • Explanation : "amanaplanacanalpanama" is a palindrome.
  • Example 2
    • Input : s = "race a car"
    • Output : false
    • Explanation : "raceacar" is not a palindrome.
  • Example 3
    • Input : s = " "
    • Output : true
      Explanation : s is an empty string "" after removing non-alphanumeric characters.
      Since an empty string reads the same forward and backward, it is a palindrome.

 

위 문제는 문자열, 구현 유형에 해당합니다.

복잡한 트릭의 도움 없이도 정확하게 읽기만 하면 풀 수 있는 문제입니다.

 

palindrome은 한국말로 '회문'을 의미하는데요.

앞에서부터 읽으나, 거꾸로 읽으나 똑같은 문장을 의미합니다.

한국말로는 '다시 합창합시다' 등의 문장이 회문에 해당합니다!

 

해당 문제는 소문자로 일괄 변환 및 알파벳과 숫자들만 남긴 후, 회문 여부를 검사하면 풀리는 문제입니다.

 

문제 자체는 간단하지만, 풀이 방법을 여러 가지 생각해 볼 수 있어서 재밌는 문제였습니다.

 

 

# 풀이 1 

class Solution:
    def isPalindrome(self, s: str) -> bool:
        strs : List = []
        
        # Convert into lowercase letters
        s = s.lower()
        
        # Only alphabet and numeric character is appended into list
        for char in s:
            if char.isalnum():
                strs.append(char)
                
        # Check the palindrome
        return strs[::] == strs[::-1]

 

문제 서술 방식에 충실하게 풀어봤습니다.

전체적인 동작 구조는 아래와 같습니다.

  1. 주어진 문자열을 소문자로 변환시킵니다.
  2. 알파벳이거나 숫자인 경우만 리스트에 포함시킵니다.
  3. 슬라이싱 기능을 활용하여 회문 여부를 확인합니다.

 

제출 결과는 위와 같았습니다.

 

 

# 풀이 2

class Solution:
    def isPalindrome(self, s: str) -> bool:
        # Convert into lowercase letters
        s = s.lower()
        
       # Only alphabet and numeric characters are not removed
        s = re.sub('[^a-z0-9]', '', s)

        # Check the palindrome
        return s[::] == s[::-1]

 

두 번째 풀이에서는 정규식을 사용해서 푼 형태입니다.

전체적인 동작 구조는 아래와 같습니다.

  1. 주어진 문자열을 소문자로 변환시킵니다.
  2. 정규식을 사용하여 알파벳이나 숫자가 아닌 경우를 모두 지웁니다. (알파벳/숫자인 경우만 지워지지 않습니다.)
  3. 슬라이싱 기능을 활용하여 회문 여부를 확인합니다.

 

제출 결과는 위와 같았습니다.

코드 줄 자체는 첫 번째 풀이보다 짧아졌으나, 런타임 시간이 늘어났다는 점이 눈에 띕니다.

 

아무래도 '풀이 1'은 내장 메서드만으로 구성되어 있어서 '풀이 2'보다 속도가 빠른 걸로 보였어요.

'풀이 2'는 정규표현식 매칭 과정에서 추가적인 시간 비용이 더 들었나 봐요.

 

여러 개의 풀이가 있으면 이런 사소한 요소들을 비교할 수 있어서 더 재밌어지더라구요.

덕분에 새롭게 알아갈 수 있어서 즐거웠습니다! ^_^

 

 


 

원래도 각종 고민 및 생각들이 머리를 가득 채우고 있었지만... 요즘 들어서 머리가 더더욱 복잡해졌어요.

그래도 한 가지 만큼은 명확해졌습니다.

 

일단 지금은 알고리즘 공부보다는 자소서/포폴/프로젝트 정비에 더 신경을 많이 써야겠어요.

 

공채가 일반적이었을 때는 알고리즘 테스트를 많이 이용했지만...

지금은 공채로 뽑는 인원이 줄기도 했고, 실무와 동떨어졌다는 이유로 알고리즘 테스트에 회의감을 갖는 선배 개발자분들도 꽤 있으신 것 같더라구요. 

차라리 과제 테스트가 더 낫다고 말씀하시는 선배 개발자분들도 계시는 것 같았어요.

 

알고리즘은 다른 공부와 함께 적당한 수준으로 병행해야겠습니다!

 

요즘 들어서 개인적 의지와 다르게 여러 이슈들이 많이 생겨서 심적으로 복잡해요...

그치만 시대를 지배하는 모든 이슈에서 자유로운 현대인은 없다는 생각이 듭니다.

 

현대인들 뿐만일까요?

시대를 막론하고 모든 이슈들은 사람과 연관되어 있었어요.

모든 인간 문명에서 철학적 요소를 발견할 수 있는 건 이것 때문이라 생각해요.

 

복잡한 시대의 표상을 받아들이고, 지금 당장 할 수 있는 것들에 임하는 게 최선이라고 생각합니다!

 

정반합! 그리고 아브락사스!!

 

 

+) 부족한 부분이 있으면 댓글로 말씀해 주세요! 겸허한 마음으로 더 공부하고 수정하겠습니다.