์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[LeetCode] 316. remove_duplicate_letters (Medium) 2023/5/8

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 5. 8. 22:00
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
316. remove_duplicate_letters 45.2% Medium
 

Remove Duplicate Letters - LeetCode

Can you solve this real interview question? Remove Duplicate Letters - Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible re

leetcode.com

 

๋ฌธ์ œ์š”์•ฝ

๋ฌธ์ž์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ ์ค‘๋ณต ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ, ์ œ์ผ ์ž‘์€ ์‚ฌ์ „์‹ ์ˆœ์„œ๋ฅผ ์ง€๋‹Œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด

์กฐ๊ฑด 1) ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ์ด๊ณ , ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

์ƒ๊ฐํ–ˆ๋˜ ํ’€์ด 0) ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ๋ฌธ์ž์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ->set์„ ์ด์šฉํ•ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , sort๋ฅผ ์ด์šฉํ•ด ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ(์˜ค๋‹ต) : ๋ฌธ์ž์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

the smallest in lexicographical order : ์ œ์ผ ์ž‘์€ ์‚ฌ์ „์‹ ์ˆœ์„œ๋กœ

: unique ํ•œ ๋ฌธ์ž์—ด์€ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ , ๋‚˜๋จธ์ง€ ์ค‘๋ณต ์›์†Œ์— ๋Œ€ํ•ด ์ œ์ผ ์ž‘์€ ์‚ฌ์ „์‹ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ƒ๊ฐํ–ˆ๋˜ ํ’€์ด1) ์ œ์ผ ์ž‘์€ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์žฌ๊ท€ํ•จ์ˆ˜ ์ด์šฉ

์ƒ๊ฐํ–ˆ๋˜ ํ’€์ด2) ๋ฌธ์ž์—ด ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์Šคํƒ ์ด์šฉ

 

 

ํ’€์ด 1

์žฌ๊ท€ ํ•จ์ˆ˜ ์ด์šฉ -> self. ํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜)

Step1. ์ œ์ผ ์ž‘์€ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ํŒ๋‹จ

  • ์ œ์ผ ์ž‘์€ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ๋๊นŒ์ง€ unique ํ•œ ์›์†Œ๊ฐ€ ๋‹ค ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ๋‹ค์‹œ ์‚ฌ์ „์‹ ์ˆœ์„œ์ธ์ง€ ํŒ๋‹จ
  • ๋‹ค ์—†์œผ๋ฉด ๋‹ค์Œ ์ž‘์€ ์›์†Œ์— ๋Œ€ํ•ด ์‚ฌ์ „์‹ ์ˆœ์„œ ํŒ๋‹จ
iterable ๊ฐ์ฒด์‚ฌ์ด์— str์„ ๋ถ™์—ฌ์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
ex) 'X'.join('str') -> 'sXtXrX'
ex) 'X'.join([a, b, c]) -> aXbXcX
์ฃผ๋กœ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ• ๋•Œ ์‚ฌ์šฉ
str.join(iterable) -> str


''.join(list)
๋ฌธ์ž์—ด์—์„œ old ๋ฌธ์ž์—ด์„ new๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
ex) 'abc'.replace('a', '') ->'bc'
str.replace(oldnew[count])->str
์šฉ์–ด์ •๋ฆฌ
์ ‘๋‘์‚ฌ : ๋‚ฑ๋ง ์•ž์— ๋ถ™์–ด ๋œป์„ ๋”ํ•ด์คŒ prefix
์ ‘๋ฏธ์‚ฌ : ๋‚ฑ๋ง ๋’ค์— ๋ถ™์–ด ๋œป์„ ๋”ํ•ด์คŒ suffix

 

 

๊ตฌํ˜„ (73ms)

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        # step1 : sorted(set(s)) - ์ œ์ผ ์ž‘์€ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด
        for char in sorted(set(s)):
            index=s.index(char)
            suffix=s[index:]
            if set(s)==set(suffix):
                return char+self.removeDuplicateLetters(suffix.replace(char, ''))
        return ''

 

ํ’€์ด 2

์Šคํƒ์ด์šฉ

Step1. ์ œ์ผ ์ž‘์€ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ํŒ๋‹จ

  • ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ์Šคํƒ์— ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋ฌธ์ž์— ๋Œ€ํ•ด ํŒ๋‹จ
  • ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ์Šคํƒ์— ์—†์œผ๋ฉด -> ์•ž์˜ ๋ฌธ์ž ์‚ญ์ œ ์—ฌ๋ถ€ ํŒ๋‹จ (์•ž์˜ ๋ฌธ์ž๊ฐ€ ๋’ค์— ๋” ์žˆ๊ณ , ํ˜„์žฌ ๋ฌธ์ž๋ณด๋‹ค ํฌ๋ฉด ์‚ญ์ œ)
๋ฆฌ์ŠคํŠธ์™€ ์ง‘ํ•ฉ ์›์†Œ ์ถ”๊ฐ€ ์‚ญ์ œ ํ•จ์ˆ˜ ์ •๋ฆฌ
๋ฆฌ์ŠคํŠธ ์›์†Œ ์ถ”๊ฐ€ list.append(value)
์›์†Œ ์‚ญ์ œ by index del list(index)
์›์†Œ ์‚ญ์ œ by value list.remove(value)
์„ธํŠธ(์ง‘ํ•ฉ) ์›์†Œ ์ถ”๊ฐ€ set.add(value)
์›์†Œ ์‚ญ์ œ - ์›์†Œ ์—†์œผ๋ฉด ์˜ค๋ฅ˜ set.remove(value)
์›์†Œ ์‚ญ์ œ - ์›์†Œ ์—†์–ด๋„ ์˜ค๋ฅ˜ X set.discard(value)

 

 

๊ตฌํ˜„ 2

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

        for char in s:
            counter[char]-=1
            # ๋งŒ์•ฝ ํ•ด๋‹น ๋ฌธ์ž ์•ž์˜ stack ์ค‘ ํ•ด๋‹น ๋ฌธ์ž๋ณด๋‹ค ํฐ๋ฐ ๋’ค์— ์žˆ๋Š” ๊ฒฝ์šฐ
            if char in seen:
                continue
            while len(stack)!=0 and counter[stack[-1]]>0 and stack[-1]>char:
                seen.remove(stack.pop()) # ๋’ค์— stack[-1]๊ฐ€ ์žˆ๊ณ , ํ˜„์žฌ ๋ฌธ์ž๋ณด๋‹ค stack[-1]๊ฐ’์ด ํฐ ๊ฒฝ์šฐ
            stack.append(char)
            seen.add(char)
        return ''.join(stack)

 

TIP

์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ํ•œ ๋ฒˆ์— ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์‹œ๊ฐ„์ด ์ค„์–ด๋“ ๋‹ค.

์ง‘ํ•ฉ์€ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†๊ณ , ๊ฐ’์˜ ์ค‘๋ณต์ด ์—†๋‹ค.

728x90