[ํ๋ก๊ทธ๋๋จธ์ค/python] ํ์๋ฒ(Greedy) : ํฐ ์ ๋ง๋ค๊ธฐ
๋ฌธ์ ์ค๋ช
์ด๋ค ์ซ์์์ k๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๊ตฌํ๋ ค ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ซ์ 1924์์ ์ ๋ ๊ฐ๋ฅผ ์ ๊ฑฐํ๋ฉด [19, 12, 14, 92, 94, 24] ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ 94 ์ ๋๋ค.
๋ฌธ์์ด ํ์์ผ๋ก ์ซ์ number์ ์ ๊ฑฐํ ์์ ๊ฐ์ k๊ฐ solution ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. number์์ k ๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ ๋ ๋ง๋ค ์ ์๋ ์ ์ค ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ๋ฌธ์์ด ํํ๋ก return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
์ ํ ์กฐ๊ฑด
- number๋ 1์๋ฆฌ ์ด์, 1,000,000์๋ฆฌ ์ดํ์ธ ์ซ์์ ๋๋ค.
- k๋ 1 ์ด์ number์ ์๋ฆฟ์ ๋ฏธ๋ง์ธ ์์ฐ์์ ๋๋ค.
์ ๋ต (1) : max ํจ์ ๊ตฌํ
def solution(number, k):
answer = ''
# max ํจ์
def _max(s, e):
num = [s, number[s]]
for i in range(s, e):
if number[i] == "9":
return [i, 9]
elif number[i] > num[1]:
num = [i, number[i]]
return num
start = 0
for end in range(k+1, len(number)):
n = _max(start, end)
answer += str(n[1])
start = n[0]+1
answer += str(max(number[start:]))
return answer
์ ๋ต (2) : stack ์ฌ์ฉ
def solution(number, k):
stack = [number[0]]
for n in number[1:] :
while stack and k > 0 and stack[-1] < n :
stack.pop()
k -= 1
stack.append(n)
return ''.join(stack[:len(number)-k])
์ ๋ต (1)์์ maxํจ์๋ฅผ ์ฐ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋๊ธธ๋
maxํจ์๋ฅผ _max ํจ์๋ก ์ง์ ๊ตฌํํ์๋ค.
์ ๋ต (2)๋ stack์ ์ด์ฉํ ๋ฐฉ๋ฒ์ผ๋ก
stack์ ๋ด๊ฒจ์๋ ์ด์ ์ ์ซ์๊ฐ ๋ ์์ผ๋ฉด ๊ทธ ์ซ์๋ฅผ ์ ๊ฑฐํ๋ค๋ ์๋ฏธ๋ก
stack.pop()ํ ํ ์ ๊ฑฐํด์ผํ๋ ์ซ์ ๊ฐ์ k์์ -1์ ํ๋ค.
์์ชฝ์ ์ซ์๊ฐ ์ปค์ ์ ๊ฑฐํด์ผํ๋ ์ซ์ ๊ฐ์๋งํผ ์ ๊ฑฐ๋์ง์์์ ๋๋ฅผ ๋๋นํ์ฌ
์ธ๋ฑ์ค ๋ฒ์ len(number)-k๊น์ง๋ง joinํ์ฌ return ํ๋ค.