2023 LG์ ์ ์ฝํ
2๋ฒ ๋ฌธ์ ์ ๋งค์ฐ ๋น์ทํ ๋ฌธ์
์ฝํ
๋ฆฌ๋ทฐ ๋ฉด์ ์ค๋นํด์ผ ํ๋๋ฐ ๋ฐ๋ณด๊ฐ์ด ๋ฌธ์ ๋ณต๊ธฐ๋ฅผ ์ํด๋ฌ์ ํฐ์ผ๋ฌ๋ค ์ถ์๋๋ฐ
์์์ค ์ฑํ
๋ฐฉ์ ์ด๋ค ๋ถ์ด ์ด ๋ฌธ์ ๋ ๋น์ทํ๋ค๊ณ ๊ทธ๋์ ๊ธฐ์ต๋จใ
โ
์์ ์ ํ ๋ฒ ํ์ด๋ดค๋ ๋ฌธ์ ์ธ๋ฐ ๊ทธ๋๋ ๋ชปํ์์๋ค
์ด์ฉ์ง ์ฝํ
์์ ํ๊ธด ํ์๋๋ฐ ์ง์ง ์ฐ์ฐํ๋๋ผ๋
โ
โจ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/17298
๋ ๊ทธ๋ ํ์ ์ฌ์ฉํด์ ํ์์๋๋ฐ ์คํ์ผ๋ก ํธ๋ ๊ฒ ์ผ๋ฐ์ ์ธ ๊ฒ ๊ฐ๋ค
n = int(input())
A = list(map(int, input().split()))
stack = []
answer = [-1] * n
stack.append(0)
for i in range(1, n):
while stack and A[stack[-1]] < A[i]:
answer[stack.pop()] = A[i]
stack.append(i)
print(' '.join(map(str, answer)))
โ
ํ์ฌ์ ์๊ฐ ๋๊ตฐ๊ฐ์ ์คํฐ์์ผ ์ ์๋ค๊ณ ์๊ฐํ์ -> ๋๊ตฐ๊ฐ์ ์คํฐ์์์ '๋๊ตฐ๊ฐ'๋ค์ ์คํ์ ๋ฃ์ด๋๋ฉด ์ข์ ๊ฒ์ด๋ค -> ์ฌ๊ธฐ์ '๋๊ตฐ๊ฐ'๋ ์คํฐ์๋ฅผ ์์ง ๋ชป์ฐพ์ ์๊ฐ ๋๋ค
์ถํ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํด ์คํ์ ์์๊ฐ์ด ์๋ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ด์ค๋ค
โ
A๊ฐ [3, 5, 2, 7] ์ผ ๋,
n=1) ์คํ์๋ 0์ด ๋ค์ด์์ผ๋ฏ๋ก A[1]๊ณผ A[0]์ ๋น๊ตํ๋ค -> A[1]์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ 0์ด ์คํ์์ ์ ๊ฑฐ๋๊ณ answer[0] = 5๊ฐ ๋๋ค stack = [1]
n=2) ์คํ์๋ 1์ด ๋ค์ด์์ผ๋ฏ๋ก A[2]์ A[1]์ ๋น๊ตํ๋ค -> A[1]์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ ์คํ์ ๊ทธ๋๋ก๋ค stack = [1, 2]
n=3) ์คํ์๋ 1, 2๊ฐ ๋ค์ด์์ผ๋ฏ๋ก 2๋ถํฐ ๋น๊ต๋ฅผ ์์ํ๋ค
A[2]์ A[3]์ ๋น๊ตํ๋ค -> A[3]์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ 2๊ฐ ์คํ์์ ์ ๊ฑฐ๋๊ณ answer[2] = 7์ด ๋๋ค stack = [1]
A[1]๊ณผ A[3]์ ๋น๊ตํ๋ค -> A[3]์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ 1์ด ์คํ์์ ์ ๊ฑฐ๋๊ณ answer[1] = 7์ด ๋๋ค stack = [3]
n=4) ๋ฐ๋ณต๋ฌธ์ด ์ข
๋ฃ๋๋ค
answer์ ์ด๊ธฐ๊ฐ์ -1์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์๋ค
โ
๋ชจ๋ ์์๊ฐ ์คํ์ push๊ฐ ํ๋ฒ์ฉ ๋๊ณ , pop์ด ํ๋ฒ์ฉ ๋๊ธฐ ๋๋ฌธ์ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค
import heapq
n = int(input())
A = list(map(int, input().split()))
minHeap = []
answer = [-1] * n
for i in range(n):
if len(minHeap) == 0:
heapq.heappush(minHeap, [A[i], i])
continue
top = minHeap[0]
if A[i] <= top[0]:
heapq.heappush(minHeap, [A[i], i])
else:
while minHeap and minHeap[0][0] < A[i]:
val, idx = heapq.heappop(minHeap)
answer[idx] = A[i]
heapq.heappush(minHeap, [A[i], i])
print(' '.join(map(str, answer)))
โ
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ํ์ด๋ ์์ ์คํ์ ์ด์ฉํ ํ์ด์ ๋น์ทํ๋ค
โ
์ด๊ฒ๋ A๊ฐ [3, 5, 2, 7] ์ผ ๋๋ฅผ ์์๋ก ๋ค์ด๋ณด๋ฉด,
n=0) minHeap = [[3, 0]]
n=1) top์ [3, 0]์ด ๋๊ณ , 5์ 3์ ๋น๊ตํ๋ค -> 5๊ฐ ๋ ํฌ๊ธฐ ๋๋ฌธ์ [3, 0]์ ํ์์ ์ ๊ฑฐํด์ฃผ๊ณ , answer[0] = 5๊ฐ ๋๋ค minHeap = [[5, 1]]
n=2) top์ [5, 1]์ด ๋๊ณ , 5์ 2๋ฅผ ๋น๊ตํ๋ค -> 5๊ฐ ๋ ํฌ๊ธฐ ๋๋ฌธ์ [2, 2]๋ฅผ ํ์ ์ถ๊ฐํด์ค๋ค minHeap = [[2, 2], [5, 1]]
n=3) top์ [2, 2]๊ฐ ๋๊ณ , 7์ 2๋ฅผ ๋น๊ตํ๋ค -> 7์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ [2, 2]๋ฅผ ํ์์ ์ ๊ฑฐํด์ฃผ๊ณ , answer[2] = 7์ด ๋๋ค
์ด์ [5, 1]์ ๋น๊ตํด์ค์ผ ํ๋ฏ๋ก, minHeap[0][0] < A[i]์ top[0] < A[i]์ผ๋ก ์ฐ๋ฉด ์๋๋ค! ์ฒจ์ ์ด๊ฑฐ ํท๊ฐ๋ฆผ
7๊ณผ 5๋ฅผ ๋น๊ตํ๋ค -> 7์ด ๋ ํฌ๊ธฐ ๋๋ฌธ์ [5, 1]์ ํ์์ ์ ๊ฑฐํด์ฃผ๊ณ , answer[1] = 7์ด ๋๋ค
minHeap = [[7, 3]]
โ
โ
์ฌ๊ธฐ์ ๊ณ ๋ฏผํด๋ณผ ์ ์ ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋๋ ๊ฒ์ธ๋ฐ,
minHeap์ด ๋ง์ฝ [[2, 2], [8, 1]]์ด๊ณ , A[i]๊ฐ 7์ด์์ ๊ฒฝ์ฐ ์ฐ์ ์์ ํ๋ฅผ ์ฐ์ง ์์ผ๋ฉด 8๊ณผ 7์ ๋น๊ตํ๊ฒ ๋๋ฏ๋ก [2, 2]๋ ๊ฒ์ฌํ์ง ๋ชปํ๊ฒ ๋๋ค
๊ทธ๋๊น ํ์ฌ์ ์๊ฐ ๋๊ตฐ๊ฐ์ ์คํฐ์๊ฐ ๋ ์๋ ์๋ ๊ฑด๋ฐ, ์คํฐ์๋ฅผ ์์ง ๋ชป์ฐพ์ ์ ์ค ์์ ์๊ฐ ํ์ฌ์ ์๊ฐ ์คํฐ์์ผ ํ๋ฅ ์ด ๋๋ค. ๋ง์ฝ ์คํฐ์๋ฅผ ์์ง ๋ชป์ฐพ์ ์๋ฅผ ์์ ํฌ๊ธฐ์ ์๊ด์์ด ๊ฒ์ฌํ๋ ค๊ณ ํ๋ฉด ์์ง ๋ชป์ฐพ์ ์ ์ ์ฒด๋ฅผ ๊ฒ์ฌํด์ผํ ๊ฒ์ด๋ค..
โ
ํ์์ ์์์ ์ถ๊ฐํ ๋์ ์ญ์ ํ ๋์ ์๊ฐ๋ณต์ก๋๋ O(lgN)์ด๋ค
์คํ์ผ๋ก ํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ์์๊ฐ ํ์ ํ๋ฒ์ฉ ์ถ๊ฐ๋๊ณ ์ญ์ ๋๊ธฐ ๋๋ฌธ์ O(NlgN)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค
์ด ํ์ด๋ ๋ฌด์กฐ๊ฑด ์๊ฐ์ด๊ณผ๊ฐ ๋จ๋ ํ์ด๋ค
ํ์ง๋ง ์์ ๋ ํ์ด๊ฐ ์ผ๋ง๋ ํจ์จ์ ์ธ์ง ์๊ธฐ ์ํด ๋ฌด์ํ๊ฒ ํ์ด๋ณด์๋ค
n = int(input())
A = list(map(int, input().split()))
answer = [-1] * n
for i in range(n):
for j in range(i+1, n):
if A[i] < A[j]:
answer[i] = A[j]
break
print(' '.join(map(str, answer)))
https://hongcoding.tistory.com/40
https://velog.io/@heyksw/Python-๋ฐฑ์ค-gold-17294-์คํฐ์
https://gluon.tistory.com/entry/๋ฐฑ์ค-17298-์คํฐ์
https://velog.io/@waoderboy/๋ฐฑ์ค-17298-์คํฐ์-ํ์ด์ฌ