[๋ฐฑ์ค€] 2493๋ฒˆ. ํƒ‘ ๐Ÿ—ผ

hagnoykmikยท2023๋…„ 11์›” 14์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
26/36
post-thumbnail

[๋ฐฑ์ค€] 2493๋ฒˆ. ํƒ‘ ๐Ÿ—ผ

์•„์ด๋””์–ด

  • ์ฒ˜์Œ์—” ๊ทธ๋ƒฅ ๋‚ด ๋‹ค์Œ๋ฒˆ์— ๋‚˜์˜ค๋Š” ๋‚˜๋ณด๋‹ค ํฐ ํƒ‘์ด ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ธ๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ ๋‚ฌ๋‹ค..
  • stack์„ ์ด์šฉํ•ด์„œ ํ‘ธ๋Š” ์ „ํ˜•์ ์ธ ๋ฌธ์ œ์˜€๋‹ค..... ์•„์ง ๋‚ด ์ˆ˜์ค€์—์„œ ์ƒ๊ฐํ•ด๋‚ด์ง„ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค.... ๐Ÿคฏ
  1. ๋ ˆ์ด์ €๋ฅผ ์˜๋Š” ๋ฐฉํ–ฅ ๋ฐ˜๋Œ€๋กœ(์™ผ โ†’ ์˜ค) ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ณด์กฐ stack์— ๋„ฃ๋Š”๋‹ค.
  2. ํ˜„์žฌ ๋ ˆ์ด์ €๋ฅผ ์˜๋Š” ํƒ‘๊ณผ stack์˜ ๋งˆ์ง€๋ง‰(top) ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๋ ˆ์ด์ €๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
    2-1. ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด(์™ผ์ชฝ ํƒ‘(stack[-1])์ด ๋” ํฌ๋‹ค๋ฉด), ๊ทธ ํƒ‘์˜ ์ธ๋ฑ์Šค๋ฅผ result ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์ฃผ๊ณ 
    2-2. ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด(๋” ์ž‘์€ ํƒ‘์ด๋ผ๋ฉด), ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ pop()ํ•ด์ค€๋‹ค.
  3. stack์— ๊ทธ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์นœ ํƒ‘์„ ๋„ฃ์–ด์ค€๋‹ค.
  4. 1-3์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
stack์™ผ์ชฝ ํƒ‘์  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€(>)ํ˜„์žฌ ํƒ‘ํƒ‘ ๋ฆฌ์ŠคํŠธresult
[]-False6[9, 5, 7, 4][0]
[6]6False9[5, 7, 4][0, 0]
[9]9True5[7, 4][0, 0, 2]
[9, 5]5False7[4][0, 0, 2]
[9]9True7[4][0, 0, 2, 2]
[9, 7]7True4[][0, 0, 2, 2, 4]
  • stack์„ ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•˜์ง€๋ง๊ณ  deque์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ’กpop()์„ ์“ธ ๋• ์ตœ๋Œ€ํ•œ deque์„ ์“ฐ์ž!!
    • list.pop() : O(N)
    • deque.pop() : O(1)

์‹œ๊ฐ„ ๋ณต์žก๋„

  • O(N)

์ฝ”๋“œ

  • deque ์ด์šฉ(O(N))
from collections import deque
import sys
input = sys.stdin.readline

n = int(input())
towers = [(i + 1, t) for i, t in enumerate(map(int, input().split()))]
stack = deque([towers[0]])
result = [0]

for j in range(1, n):
    tower = towers[j][1]
    razer = 0

    # ๋น„๊ตํ•  ๋Œ€์ƒ์ด ์žˆ์œผ๋ฉด
    while stack: 
        # ์™ผ์ชฝ์— ์žˆ๋Š” ํƒ‘์ด ๋‚˜๋ณด๋‹ค ์ž‘์œผ๋ฉด ์“ธ๋ชจ์—†์–ด์ง€๋‹ˆ๊นŒ ์—†์•ค๋‹ค
        if tower > stack[-1][1]:
            stack.pop() 
        
        # ๋‚˜๋ณด๋‹ค ํฌ๋ฉด ๋ ˆ์ด์ € ์ˆ˜์‹  ๊ฐ€๋Šฅ
        else:
            razer = stack[-1][0]
            break
        
    stack.append((j + 1, tower))
    result.append(razer)

print(*result)
  • stack ์ด์šฉ (O(N^2))
import sys
input = sys.stdin.readline

n = int(input())
towers = [(i + 1, t) for i, t in enumerate(map(int, input().split()))]
stack = [towers[0]]
result = [0]

for j in range(1, n):
    tower = towers[j][1]
    razer = 0

    # ๋น„๊ตํ•  ๋Œ€์ƒ์ด ์žˆ์œผ๋ฉด
    while stack: 
        # ์™ผ์ชฝ์— ์žˆ๋Š” ํƒ‘์ด ๋‚˜๋ณด๋‹ค ์ž‘์œผ๋ฉด ์“ธ๋ชจ์—†์–ด์ง€๋‹ˆ๊นŒ ์—†์•ค๋‹ค
        if tower > stack[-1][1]:
            stack.pop() 
        
        # ๋‚˜๋ณด๋‹ค ํฌ๋ฉด ๋ ˆ์ด์ € ์ˆ˜์‹  ๊ฐ€๋Šฅ
        else:
            razer = stack[-1][0]
            break
        
    stack.append((j + 1, tower))
    result.append(razer)

print(*result)

  • ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ (O(N^2))
import sys
input = sys.stdin.readline

n = int(input())
stack = list(map(int, input().split()))
stack.reverse()
result = []

for i, tower in enumerate(stack):
    answer = 0
    for j in range(i + 1, n):
        if tower <= stack[j]:
            answer = n - j
            break
    result.append(answer)

result.reverse()
print(*result)
profile
์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž, ๊น€๊ฒฝ์•„์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€