[Python] λ°±μ€ 2841 μΈκ³μΈμ κΈ°ν μ°μ£Ό (Stack)


π λ¬Έμ
μκ·Όμ΄μ μμμ μΉκ΅¬ μΈκ³μΈμ μκ°λ½μ μμμ΅κ° κ°μ§κ³ μλ€. μ΄λ λ μΈκ³μΈμ κΈ°νκ° μΉκ³ μΆμκ³ , μΈν°λ·μμ κ°λ¨ν λ©λ‘λλ₯Ό κ²μνλ€. μ΄μ μ΄ κΈ°νλ₯Ό μΉλ €κ³ νλ€.
λ³΄ν΅ κΈ°νλ 1λ² μ€λΆν° 6λ² μ€κΉμ§ μ΄ 6κ°μ μ€μ΄ μκ³ , κ° μ€μ Pκ°μ νλ μΌλ‘ λλμ΄μ Έ μλ€. νλ μ λ²νΈλ 1λ²λΆν° Pλ²κΉμ§ λλμ΄μ Έ μλ€.
λ©λ‘λλ μμ μ°μμ΄κ³ , κ° μμ μ€μμ ν΄λΉνλ νλ μ λλ₯΄κ³ μ€μ νκΈ°λ©΄ μ°μ£Όν μ μλ€. μλ₯Ό λ€λ©΄, 4λ² μ€μ 8λ² νλ μ λλ₯΄κ³ νκΈΈ μ μλ€. λ§μ½, μ΄λ€ μ€μ νλ μ μ¬λ¬ κ° λλ₯΄κ³ μλ€λ©΄, κ°μ₯ λμ νλ μ μμ΄ λ°μνλ€.
μλ₯Ό λ€μ΄, 3λ² μ€μ 5λ² νλ μ μ΄λ―Έ λλ₯΄κ³ μλ€κ³ νμ. μ΄λ, 7λ² νλ μ λλ₯Έ μμ μ°μ£Όνλ €λ©΄, 5λ² νλ μ λλ₯΄λ μμ λΌμ§ μκ³ λ€λ₯Έ μκ°λ½μΌλ‘ 7λ² νλ μ λλ₯΄κ³ μ€μ νκΈ°λ©΄ λλ€. μ¬κΈ°μ 2λ² νλ μ μμ μ°μ£Όνλ €κ³ νλ€λ©΄, 5λ²κ³Ό 7λ²μ λλ₯΄λ μκ°λ½μ λ λ€μμ 2λ² νλ μ λλ₯΄κ³ μ°μ£Όν΄μΌ νλ€.
μ΄λ κ² μκ°λ½μΌλ‘ νλ μ ν λ² λλ₯΄κ±°λ λΌλ κ²μ μκ°λ½μ ν λ² μμ§μλ€κ³ νλ€. μ΄λ€ λ©λ‘λκ° μ£Όμ΄μ‘μ λ, μκ°λ½μ κ°μ₯ μ κ² μμ§μ΄λ νμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ λ©λ‘λμ ν¬ν¨λμ΄ μλ μμ μ Nκ³Ό ν μ€μ μλ νλ μ μ Pκ° μ£Όμ΄μ§λ€. (N ≤ 500,000, 2 ≤ P ≤ 300,000)
λ€μ Nκ° μ€μλ λ©λ‘λμ ν μμ λνλ΄λ λ μ μκ° μ£Όμ΄μ§λ€. 첫 λ²μ§Έ μ μλ μ€μ λ²νΈμ΄κ³ λ λ²μ§Έ μ μλ κ·Έ μ€μμ λλ¬μΌ νλ νλ μ λ²νΈμ΄λ€. μ λ ₯μΌλ‘ μ£Όμ΄μ§ μμ μμλλ‘ κΈ°νλ₯Ό μ°μ£Όν΄μΌ νλ€.
μΆλ ₯
첫째 μ€μ λ©λ‘λλ₯Ό μ°μ£Όνλλ° νμν μ΅μ μκ°λ½ μμ§μμ μΆλ ₯νλ€.
μμ μ λ ₯ 1
5 15
2 8
2 10
2 12
2 10
2 5
μμ μΆλ ₯ 1
7
μμ μ λ ₯ 2
7 15
1 5
2 3
2 5
2 7
2 4
1 5
1 3
μμ μΆλ ₯ 2
9
π νμ΄
import sys
input = sys.stdin.readline
n, p = map(int, input().split())
lines = [[] for _ in range(7)]
cnt = 0
for _ in range(n):
line, fret = map(int, input().split())
line = lines[line - 1]
while line and fret < line[-1]:
line.pop()
cnt += 1
if not line or fret > line[-1]:
line.append(fret)
cnt += 1
print(cnt)
ν μ€μ λλ €μλ νλ λ²νΈλ₯Ό μ μ₯νκΈ° μν΄ stackμ μ¬μ©νκ³ , μ€μ΄ μ¬λ¬κ°μ΄κΈ° λλ¬Έμ stackλ€μ 리μ€νΈλ₯Ό λ§λ€μ΄ μ¬μ©ν©λλ€.
- line: ν΄λΉ μ€ stack
- fret: νμ¬ λλ₯΄λ €λ νλ λ²νΈ
stack μνμ κ²½μ°μ μλ₯Ό μ΄ν΄ 보면 ν¬κ² μλ 7κ°μ κ²½μ°κ° μμ΅λλ€.

μ°λ¦¬κ° μ·¨ν΄μΌ ν λμμ popμ΄κ±°λ appendμ΄κ±°λ λ μ€ νλμ΄λ―λ‘, popμ΄ νμν κ²½μ°μ appendκ° νμν κ²½μ°λ₯Ό μ΄λΆλ²μ μΌλ‘ λλ 보면 μλμ κ°μ΅λλ€.
- while line and fret < line[-1]
stackμ΄ μ°¨ μκ³ stack topμ΄ λλ₯΄λ €λ νλ λ³΄λ€ ν° λ²νΈμΈ κ²½μ° pop - if not line or fret > line[-1]
stackμ΄ λΉμ΄ μκ±°λ stack topμ΄ λλ₯΄λ €λ νλ λ³΄λ€ μμ λ²νΈμΈ κ²½μ° append