๏นฅ

Leetcode 402. Remove K Digits (Python3)

@๋‚จ์ œ์ด ยท 2024๋…„ 07์›” 19์ผ ยท 3๋ถ„
problem_solvingleetcodepython

๋ฌธ์ œ ๋งํฌ

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 ๊ฐœ ๋งŒํผ ์ •์ˆ˜๋ฅผ ์ œ์™ธ์‹œ์ผœ์ค€๋‹ค.

์ด๋•Œ, ๋น„๊ต๊ฐ€ ๋๋‚˜๋”๋ผ๋„ ์ œ์™ธํ•  ์ˆซ์ž๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋’ค์—์„œ๋ถ€ํ„ฐ ์ •์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ ์ด์œ ๋Š” ์•ž์—์„œ ๋น„๊ตํ–ˆ์„ ๋•Œ ์•ž์˜ ์ˆซ์ž๊ฐ€ ๋” ์ž‘์€ ์ˆซ์ž๊ฐ€ ์˜ค๋„๋ก ๋น„๊ต๋ฅผ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์—์„œ ๋ถ€ํ„ฐ ์ œ๊ฑฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์•˜๋‹ค.


image


๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด 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)

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์•˜๋‹ค.


image2


๋น„๊ต๊ฐ€ ๋๋‚˜๊ณ ๋‚˜์„œ 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"
image

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'
image