Algorithm

LeetCode) removeDuplicateLetters

주코식딩 2022. 5. 16. 18:03

중복된 문자를 제거하고 사전적 순서가 가장 적은 순으로 나열하라는 문제다.

 

이 문제는 직접 풀긴 했지만 속도가 100ms 정도로 하위 5%에 속하는 속도를 보여서 문제를 풀긴했지만 아주 찝찝하기 그지 없었다. stack문제인데 대체 어디서 스택을 써야하는지 감도 오지 않는다.

 

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        temp_s = sorted(list(set(s)))

        t1 = 0
        temp_i = 0
        result = []
        while temp_s:
            t2 = temp_s[t1]
            for i in range(temp_i,len(s)):
                if s[i] == t2:
                    flag = 0
                    for j in temp_s:
                        if j not in s[i:]:
                            flag = 1
                            break
                    if flag == 0:
                        result.append(t2)
                        del temp_s[t1]
                        t1 = 0
                        temp_i = i
                        break
                    else:
                        t1 += 1
                        break


        return "".join(result)

 

 

답안 코드.. 너무 어렵게 품; 카운터, 집합, 스택 3가지를 한번에 활용하는데 머리 속에 당연히 들어올리 없다.

파이썬 알고리즘 인터뷰 << 이 책은 너무 숏코딩에 집착하는 것 같기도 하다.. 덕분에 코드가 이해하기 너무 어렵다

저 while 안에 3가지 조건이 대체 어떤 식으로 나왔나 이해하기 힘들다...............................................................................

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        counter, seen, stack = collections.Counter(s), set(), []

        for char in s:
            counter[char] -= 1
            if char in seen:
                continue
            while stack and char < stack[-1] and counter[stack[-1]] > 0:
                seen.remove(stack.pop())
            stack.append(char)
            seen.add(char)

        return ''.join(stack)

 

'Algorithm' 카테고리의 다른 글

LeetCode) lengthOfLongestSubstring  (0) 2022.05.18
LeetCode) mergeKLists  (0) 2022.05.17
LeetCode) Reverse Linked List II  (0) 2022.05.16
백준) 괄호  (0) 2022.05.15
LeetCode) 21. Merge Two Sorted Lists  (0) 2022.05.14