π λ°±μ€ 2493 - ν
λ¬Έμ : λ°±μ€ 2493 - ν
π‘ λμ νμ΄
μ€νμ νμ©νλ©΄ λλ λ¬Έμ μΈλ° λ¨Έλ¦ΏμμΌλ‘λ λ¨κ³λ³λ‘ μκ°μ΄ μ λλλ° μ½λλ‘ κ΅¬ννλ €λκΉ μ½μ§ μμλ€. μ°μ λ²μκ° 500,000
μ΄κΈ° λλ¬Έμ μ΄μ€ λ°λ³΅λ¬Έμ μ¬μ©νλ©΄ μ΅λ 250,000,000,000
κΉμ§μμ λͺ
μ¬ν΄μΌ νλ€. μ¬κΈ°μ μλ¬Έμ μ μ±κ³΅μ½λμ μ€ν¨ μ½λμ μκ° λ³΅μ‘λμ μ°¨μ΄λ (index
, slicing
)μ μ°¨μ΄μΈκ² κ°μλ° μ μκ°μ΄κ³Όκ° λλμ§ μ λͺ¨λ₯΄κ² λ€.(κ³ μλλ€ λκΈλΆνλ립λλ€ :))
---
[ 21. 7. 13. ]
λ°±μ€μ μκ°μ΄κ³Ό κ΄λ ¨νμ¬ μ§λ¬Έμ λ¨κ²Όλλ° @djm03178λκ»μ μ’μ λ΅λ³μ ν΄μ£Όμ ¨λ€. κ²°λ‘ μ μΌλ‘ μκ°λ³΅μ‘λλ λ€μκ³Ό κ°λ€.
1. μ±κ³΅μ½λ(O(N)): κ° μμκ° μ€νμ λ€μ΄κ°κ³ λμ€λ μ°μ°μ΄ ν λ²μ©λ§ μνλλ€.
2. slicing(O(N^2)): κ° μμλ§λ€ `slicing`μ μννλλ° λμ μμμ μκ° 1λΆν° `N`κΉμ§ κ³μ μ¦κ°νκ³ `slicing`μ μκ°λ³΅μ‘λλ μμμ μμ λΉλ‘νλ―λ‘ `O(N^2))`μ΄ λλ€.
3. index(O(N^2)): κ° μμλ§λ€ `index`ν¨μκ° ν΄λΉ μμλ₯Ό μ°ΎκΈ° μν΄ λ¦¬μ€νΈλ₯Ό μ²μλΆν° λκΉμ§ μννκΈ°λλ¬Έμ μμ `O(N^2))`κ° λλ€.
λλ²μ§Έ μΈλ²μ§Έ μ½λλ μ΄ν΄κ° μ λμΌλ 첫λ²μ§Έ μ½λκ° μ `O(N)` μΈμ§ μ΄ν΄κ° μλΌμ μ§λ¬Έμ λ¨κ²Όλλ λ€μκ³Ό κ°μ λ΅λ³μ λ°μλ€.
" 첫λ²μ§Έ μ½λμμ μ΄μ€ λ°λ³΅λ¬Έμ κ°κ° μ΅μ μ κ²½μ° `O(N)`λ²μ© λλ€κ³ μκ°ν΄μ `for * while = O(N^2)` μ΄λΌκ³ νλ¨νλ©΄ μλλ€. λ§μΌ λ°κΉ₯ 루νκ° νλ² λ λ μ΄μ΄ μ μ’μμ μμͺ½ 루νμ `N`κ°μ μμλ₯Ό popνλ€κ³ κ°μ νλ©΄, κ·Έ νλ²μ 루νλ₯Ό μ μΈν λλ¨Έμ§λ λͺ¨λ `pop`μ μνλ€λ κ²μ΄λ€.(while stack: 쑰건λλ¬Έμ) μ¦, μ무리 루νλ₯Ό μ€λ λλ¦¬λ €κ³ ν΄λ μμͺ½ 루νκ° Nλ²λ³΄λ€ λ§μ΄ λ μ λ μλ€.
μΈμ κ° λ§μ΄ λ λκ° μλ€λ©΄, λ€λ₯Έ λλ λ§μ΄ μ λμμ΄μΌλ§ νκ³ μ΄ νμ μμ `O(N)`λ°μ μλλ€. μ¦, μμͺ½ 루νκ° λλ μ΄ νμλ₯Ό λ€ ν©νμ λ `O(N)`μ΄λΌλ ν° κ·Έλ¦Όμ 보λκ² μ€μνμ§, λ°κΉ₯ 루νκ° ν λ² λλ μμͺ½ 루νκ° μ΅λ `O(N)`λ² λλ κ·Έλ¦Όμ λ³Ό νμκ° μλ€λ λ»μ΄λ€. μ΄ μ½λμ μ΅μ μ κ²½μ°μλ μ μ²΄κ° `O(N)`μ΄λ€. "
λΌκ³ λ΅κΈμ λ¬μμ£Όμ ¨λλ°.. κ΅μ₯ν λ©μμΌμ ¨λ€. λλ μ΄μ¬ν 곡λΆν΄μ μ λΆμ²λΌ λ΅κΈμ λ¬μμ€ μ μλ λ μ΄ μμΌλ©΄ μ’κ² λ€. λ΅λ³κ³Ό ν¨κ» λΆν μνλΆμ λ§ν¬λ μ£Όμ ¨λλ° νλ² μ΄ν΄λ΄μΌκ² λ€.
---
μ€ν¨ μ½λλ λ€μμλΆν° λΉκ΅νκ³ μ±κ³΅μ½λλ μμμλΆν° λΉκ΅νλ€. μ±κ³΅μ½λμ νμ΄ λ°©λ²μ 보μ.
stack
μ΄ μ‘΄μ¬νλ λμμ μ΄μ μ λ€μ΄μ¨stack[-1][1]
μ κ°κ³Ό μ§κΈ λ€μ΄μ¬top[i]
μ κ°μ λΉκ΅νλ€.- λ§μ½, μ΄μ μ λ€μ΄μ¨
stack[-1][1]
μ κ°μ΄top[i]
λ³΄λ€ ν¬λ©΄ λ μ΄μ μ νΈλ₯Ό μμ ν μ μκΈ° λλ¬Έμ κ·Έλμstack[-1][0](index)
λ₯Ό μ μ₯νλ€. - κ·Έλ μ§ μμΌλ©΄, λ€μμΌλ‘ μ‘΄μ¬νλ
stack
κ°μ νμΈνκΈ° μν΄pop()
νλ€. stack
μ μ무κ²λ λ¨μ§ μμΌλ©΄[i, top[i]]
κ°μ λ£λλ€.(μ΄λ,i
λ₯Ό λ£λ μ΄μ λindex
λ₯Ό μ μ₯νκΈ° μν¨μ΄λ€.)
μ΄ν΄κ° μ μ λλ©΄ λ€μ μ¬μ§μ 보μ.
# μ±κ³΅ μ½λ
n = int(input())
top = list(map(int, input().split()))
stack = []
answer = [0 for i in range(n)]
for i in range(n):
while stack:
if stack[-1][1] > top[i]:
answer[i] = stack[-1][0] + 1
break
else:
stack.pop()
stack.append([i, top[i]])
print(*answer)
n = int(input())
top = list(map(int, input().split()))
index = [0] * n
# μκ° μ΄κ³Ό μ½λ: slicing ν¨μ μ¬μ©
for i in range(1, n):
stack = top[:n - i]
index_value = len(stack)
while stack:
if stack[-1] > top[n - i]: # νμ¬ κ°λ³΄λ€ νμ΄ λ ν¬λ©΄
high_top = stack[-1]
index[n - i] = index_value
break
else: # νμ¬ κ°λ³΄λ€ νμ΄ μκ±°λ κ°μΌλ©΄
index_value -= 1
stack.pop()
# μκ° μ΄κ³Ό λλ²μ§Έ μ½λ: index ν¨μ μ¬μ©
for i in range(1, n):
stack = top[:n-i]
while stack:
if stack[-1] > top[n-i]: # νμ¬ κ°λ³΄λ€ νμ΄ λ ν¬λ©΄
high_top = stack[-1]
index[n-i] = top.index(high_top) + 1
break
else:
stack.pop()
print(' '.join(map(str, index)))
'Algorithm > λ°±μ€(BOJ)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ νμ΄μ¬(python) ] λ°±μ€ 17952 - κ³Όμ λ λλμ§ μμ! (0) | 2021.07.12 |
---|---|
[ νμ΄μ¬(python) ] λ°±μ€ 20001 - κ³ λ¬΄μ€λ¦¬ λλ²κΉ (0) | 2021.07.12 |
[ νμ΄μ¬(python) ] λ°±μ€ 2504 - κ΄νΈμ κ° (2) | 2021.07.07 |
[ νμ΄μ¬(python) ] λ°±μ€ 3986 - μ’μ λ¨μ΄ (3) | 2021.07.06 |
[ νμ΄μ¬(python) ] λ°±μ€ 4949 - κ· νμ‘ν μΈμ (0) | 2021.07.05 |
λκΈ