๋ฌธ์ ๋งํฌ
https://leetcode.com/problems/remove-k-digits/
๋ฌธ์ ์์ฝ
์์๊ฐ ์๋ ์ ์๋ฅผ ๋ํ๋ด๋ num
์ด๋ผ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๊ณ ์ ์์ธ k
๊ฐ ์ฃผ์ด์ง๋ค.
๋ฌธ์์ด num
์์ k
๊ฐ์ ์ซ์๋ฅผ ์ง์ ์ ๋ ๊ฐ์ฅ ์์ ์ซ์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
๋ฌธ์ ํ์ด
๋ฌธ์ ๊ฐ ๋๋ฌด ๊ฐ๋จํ๊ฒ ์ ํ์๊ธฐ ๋๋ฌธ์ ์๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ์ดํดํด ๋ณด๋ ค๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด, num = "1432219"
, k = 3
์ธ ๊ฒฝ์ฐ 4, 3, 2 ๊ฐ ์ง์์ ธ์ "1219"
๊ฐ ๊ฐ์ฅ ์์ ๋ฌธ์์ด์ด ๋๋ค.
๋ฌธ์ ์๋ ๋์์์ง ์์ง๋ง ์ ์ํด์ผํ ์ ์ ์ ๋ ฌ์ ํ ์ ์๊ณ ์ ์ธํ ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค ๋ ์ ์ด๋ค.
๊ทธ๋ ๊ธฐ์ ๋น์ฐํ ๊ฐ์ฅ ํฐ ์ซ์๋ง ์ ์ธํ๊ณ ํฉ์ณ์ฃผ๊ฒ ๋๋ฉด ๋ ์์ ๊ฒฝ์ฐ๋ฅผ ๋์น๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋น ์ง๊ฒ ๋๋ ๋ฌธ์๋ฅผ ์ง์ด ์ฑ ํฉ์ณ์ฃผ์ด์ผ ํ๋ค.
๋ง์ฝ ๊ฐ์ฅ ํฐ ์ซ์๋ง ์ ์ธํ๊ฒ ๋๋ค๋ฉด 1
4 3 2 2 1
9 ์ด ๋์ด 1 2 1 9
๋ณด๋ค ํฐ ์ ์๊ฐ ๋๋ค.
๋ฐ๋ผ์ 1
4 3 2 2 1 9
์ ๊ฐ์ด ์ค๊ฐ์ ์๋ 3๊ฐ(4, 3, 2)
์ ๋ฌธ์๊ฐ ์ ๊ฑฐ๋๋ฉด์ ๋ค์ ํฉ์ณ์ ธ ๊ฐ์ฅ ์์ ์ ์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ด ๋๋ค๋ ๊ฒ์ ์๊ฐํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค.
๋ฏธ์ง๋ง์ผ๋ก num ์ ์ ์ ๊ฐฏ์์ k ๊ฐ ๊ฐ๋ค๋ฉด? ๊ทธ๋ผ ๋ชจ๋ ์ ์๊ฐ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ "0" ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
์, ๊ทธ๋์ ์ด ๋ฌธ์ ์ ํ๊ธฐ ์ํ ํต์ฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
k ๊ฐ์ ์ ์๋ฅผ ์ ์ธํ ํ ์ ๋ ฌ์ ํ ์ ์๋ค.
๋ ์์ ์ ์ ๋ฌธ์์ด์ ๋ง๋ค๊ธฐ ์ํด์๋ ํฐ ๋จ์์ ์ซ์๊ฐ ์์์ผ ํ๋ค. (์ผ์ชฝ์ผ๋ก ๊ฐ์๋ก ํฐ ๋จ์)
num ์ ์ ์ ๊ฐฏ์์ k ๊ฐ ๊ฐ๋ค๋ฉด ๋ชจ๋ ์ ์๊ฐ ์ ์ธ๋๋ฏ๋ก "0" ์ด ๋๋ค.
์์ ์กฐ๊ฑด์ ์ดํด๋ณด๋ฉด ๊ฒฐ๊ตญ์๋ ์์๋ฆฌ๊ฐ ๋ ์์ผ๋ฉด ๋๋ค ๋ ๋ง์ด๋ค.
์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋๋ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํตํด ํ์ด๋ณด์๋ค.
์ฐธ๊ณ ๋ก ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ ๋ ์๋์ ์กฐ๊ฑด์ ๊ผญ ๋ฃ์ด์ฃผ์๋ค.
if len(num) <= k:
return "0"
List ๋ก ๋ง๋ค์ด์ ํ์ด๋ณด๊ธฐ
์ฒ์์๋ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด์ ํ์ฌ ์์นํ ์ซ์๋ณด๋ค ์์ ์์นํ ์ซ์๋ฅผ ๋ ์๊ฒ ๋ง๋ค์ด์ฃผ๋ฉด ๋์ง ์์๊น? ํ๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
๊ทธ๋์ ๋ฌธ์์ด์ธ num
์ List
๋ก ๋ง๋ค์ด์ฃผ์๋ค.
num_list = list(num)
๋จผ์ , num ์ ์ฒซ ๋ฒ์งธ ์ ์๋ ๊ฐ์ฅ ์ฒ์์ค๋ ์ซ์์ฌ์ ๋น๊ตํ ๋์์ด ์์ด ๊ฑด๋๋ฐ๊ณ ๋ค์ ์ ์๋ถํฐ ๋น๊ต๋ฅผ ํด์ฃผ์๋ค.
i = 1
while i < len(num_list) and k > 0:
if num_list[i-1] > num_list[i]:
num_list.pop(i-1)
k -= 1
i = 1
else:
i += 1
๋ง์ฝ ์์ ์ ์๊ฐ ํ์ฌ ์์นํ ์ ์๋ณด๋ค ๋ ํฌ๋ค๋ฉด ํด๋น ์ ์๋ฅผ ๋ฆฌ์คํธ์์ ์ ๊ฑฐํด์ฃผ์๋ค.
๊ทธ๋ผ ํ๋์ ์ ์๊ฐ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ k ๊ฐ ํ๋ ์ค์ด๋ ๋ค. (k - 1)
๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋น๊ตํด์ k ๊ฐ ๋งํผ ์ ์๋ฅผ ์ ์ธ์์ผ์ค๋ค.
์ด๋, ๋น๊ต๊ฐ ๋๋๋๋ผ๋ ์ ์ธํ ์ซ์๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ์๋ ๋ค์์๋ถํฐ ์ ์๋ฅผ ์ ๊ฑฐํด์ฃผ๋ฉด ๋๋ค.
๊ทธ ์ด์ ๋ ์์์ ๋น๊ตํ์ ๋ ์์ ์ซ์๊ฐ ๋ ์์ ์ซ์๊ฐ ์ค๋๋ก ๋น๊ต๋ฅผ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ค์์ ๋ถํฐ ์ ๊ฑฐํด์ฃผ๋ฉด ๋๋ค.
์ด ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ณด์๋ค.
๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ด k ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ธ๋ฅผ ์์ผ์ค๋ค.
if k > 0:
num_list = num_list[:-k]
์ด์ ๋ฆฌ์คํธ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ํฉ์ณ์ฃผ๋ฉด ๋๋๋ฐ join()
ํจ์๋ฅผ ํตํด์ ํฉ์ณ์ฃผ๋ ์์ 0 ์ด ์ค๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ์ "0" ์ด ์๋ ๊ฒฝ์ฐ์๋ lstrip()
ํจ์๋ฅผ ์ฌ์ฉํด์ ์ ์ธ์์ผ์ฃผ์๋ค.
๋ง์ง๋ง์ผ๋ก ๋จ์์๋ ์ ์๊ฐ ์๋ค๋ฉด "0" ์๋ค๋ฉด ํฉ์ณ์ค ๋ฌธ์์ด์ ๋ฐํํ๋ฉด ๋๋ค.
return "".join(num_list).lstrip("0") if "".join(num_list).lstrip("0") else "0"
์ด๋ ๊ฒ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋๋ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ ์คํ ์๊ฐ์ด ๊ฑฐ์ ๊ผด๋ฑ์ด์๋ค.
๊ทธ ์ด์ ๋ ์๋ฌด๋๋ ๋น๊ตํ๊ณ ๋์ ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ๋ชจ๋ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ๋น๊ตํ๊ณ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋งค์ฐ ๋๋ฆด ์ ๋ฐ์ ์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ๋ฆฌ์คํธ๊ฐ ์๋ ์คํ์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ธฐ๋ก ํ๋ค.
Stack ์ผ๋ก ํ์ด๋ณด๊ธฐ
์คํ์ผ๋ก ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์์ ์๊ธฐํ๋ ์กฐ๊ฑด ์ค ํ๋์ธ ํ์ฌ ์๋ฆฌ์ ์ ์๋ณด๋ค ์ ์๋ฆฌ ์ ์๊ฐ ๋ ์์์ผ ํ๋ค๋ ์ ์ ์๊ฐํด์ ํ ์ ์์๋ค.
๋ง์ฝ ์คํ์ ์ ์๋ฅผ ๋ฃ์ผ๋ ค๊ณ ํ ๋ ๋ ํฐ ์ ์๊ฐ ์๋ค๋ฉด ๊บผ๋ด๊ณ ์ ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋จผ์ , ์คํ์ผ๋ก ์ฌ์ฉํ ๋ฆฌ์คํธ๋ฅผ ํ๋ ๋ง๋ค์ด์ค๋ค.
stack = []
๋ค์์ผ๋ก num
์ ์๋ ์ซ์๋ฅผ ํ๋์ฉ ๊ฐ์ ธ์ stack
์ ๋ฃ์ด์ฃผ๋ ค๊ณ ํ๋ค.
์์์ ๋งํ ์กฐ๊ฑด์ ๋ง๋ ์ ์๋ฅผ ๋ฃ๊ธฐ ์ํด์๋ stack
์ ๋ค์ด๊ฐ์๋ ์์ ์ค ๋ค์ด๊ฐ๋ ค๊ณ ํ๋ ์ ์๋ณด๋ค ํฐ ๊ฐ์ด ์กด์ฌํ๋ฉด ๊บผ๋ด์ ์ ์ธ์์ผ์ค๋ค.
๊ทธ๋ ๊ฒ ์ ์๋ฅผ ๋ค ๊บผ๋ด๊ณ ๋์ ๋ค์ด๊ฐ๋ ค๊ณ ํ๋ ์ ์๋ฅผ ๋ฃ์ด์ค๋ค.
์ด์ ๊ฐ์ ๊ณผ์ ์ ์ ์๋ฅผ ๋ฃ์ ๋๋ง๋ค k ๋งํผ ๋ฐ๋ณตํด์ฃผ๊ฒ ๋๋ค.
์ด๋, ๋ฆฌ์คํธ์ ๋ค๋ฅธ ์ ์ ๊ตณ์ด ์ฒ์์ผ๋ก ๋์๊ฐ์ง ์์๋ ๋๋ค๋ ์ ์ด๋ค.
for digit in num:
while stack and digit < stack[-1] and k > 0:
stack.pop()
k -= 1
stack.append(digit)
์ด์ ๊ฐ์ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ณด์๋ค.
๋น๊ต๊ฐ ๋๋๊ณ ๋์ k ๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ์๋ ๋ฆฌ์คํธ์์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ค์์ ๋ถํฐ ์ ์๋ฅผ ์ ์ธ์์ผ์ฃผ๊ณ ๋ฌธ์๋ฅผ ํฉ์ณ์ค ๋ค์ ์์ ์๋ "0" ์ ์ ์ธ์์ผ์ฃผ์๋ค.
return "".join(stack[:-k] if k else stack).lstrip('0') or '0'
๋ฆฌ์คํธ๋ก ํ์์ ๋์๋ ๋งค๋ฒ ์ฒ์๋ถํฐ ๋ค์ ๋น๊ต๋ฅผ ํด์ฃผ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ ๋ฐ๋ฉด์ ์คํ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ง์ง๋ง ์์๋ง ๋น๊ตํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํจ์จ์ ์ผ๋ก ํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
์ ์ถ ๋ต์
List ๋ก ๋ง๋ค์ด์ ํผ ๋ต์
"""
์คํ ์๊ฐ : 287ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ : 17.90MB
์๊ฐ ๋ณต์ก๋ : O(N)
"""
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
if len(num) <= k:
return "0"
num_list = list(num)
i = 1
while i < len(num_list) and k > 0:
if num_list[i-1] > num_list[i]:
num_list.pop(i-1)
k -= 1
i = 1
else:
i += 1
if k > 0:
num_list = num_list[:-k]
return "".join(num_list).lstrip("0") if "".join(num_list).lstrip("0") else "0"
Stack ์ผ๋ก ํผ ๋ต์
"""
์คํ ์๊ฐ : 36ms
๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ : 17.93MB
์๊ฐ ๋ณต์ก๋ : O(N)
"""
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
if len(num) <= k:
return "0"
stack = []
for digit in num:
while stack and digit < stack[-1] and k > 0:
stack.pop()
k -= 1
stack.append(digit)
return "".join(stack[:-k] if k else stack).lstrip('0') or '0'