[๋ฐฑ์ค€ ๐Ÿฅ‡4] 17298๋ฒˆ ์˜คํฐ์ˆ˜ (Python/ํŒŒ์ด์ฌ)

mingssoยท2023๋…„ 5์›” 9์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
31/35

1๏ธโƒฃ ์„œ๋ก 

2023 LG์ „์ž ์ฝ”ํ…Œ 2๋ฒˆ ๋ฌธ์ œ์™€ ๋งค์šฐ ๋น„์Šทํ•œ ๋ฌธ์ œ
์ฝ”ํ…Œ ๋ฆฌ๋ทฐ ๋ฉด์ ‘ ์ค€๋น„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ฐ”๋ณด๊ฐ™์ด ๋ฌธ์ œ ๋ณต๊ธฐ๋ฅผ ์•ˆํ•ด๋‘ฌ์„œ ํฐ์ผ๋‚ฌ๋‹ค ์‹ถ์—ˆ๋Š”๋ฐ
์ž์†Œ์„ค ์ฑ„ํŒ…๋ฐฉ์— ์–ด๋–ค ๋ถ„์ด ์ด ๋ฌธ์ œ๋ž‘ ๋น„์Šทํ–ˆ๋‹ค๊ณ  ๊ทธ๋ž˜์„œ ๊ธฐ์–ต๋‚จใ…Ž
โ€‹
์˜ˆ์ „์— ํ•œ ๋ฒˆ ํ’€์–ด๋ดค๋˜ ๋ฌธ์ œ์ธ๋ฐ ๊ทธ๋•Œ๋„ ๋ชปํ’€์—ˆ์—ˆ๋„ค
์–ด์ฉ์ง€ ์ฝ”ํ…Œ์—์„œ ํ’€๊ธด ํ’€์—ˆ๋Š”๋ฐ ์ง„์งœ ์ฐ์ฐํ•˜๋”๋ผ๋‹ˆ

โ€‹
โœจ ๋ฌธ์ œ ๋งํฌ
https://www.acmicpc.net/problem/17298



2๏ธโƒฃ ํ’€์ด

๋‚œ ๊ทธ๋•Œ ํž™์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์—ˆ์—ˆ๋Š”๋ฐ ์Šคํƒ์œผ๋กœ ํ‘ธ๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค

ํ’€์ด1 - ์Šคํƒ ์‚ฌ์šฉ (1664ms) -> O(N)

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)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค



ํ’€์ด2 - ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ (2928ms) -> O(NlgN)

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)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค



ํ’€์ด3 - ์ด์ค‘ for๋ฌธ ์‚ฌ์šฉ (์‹œ๊ฐ„์ดˆ๊ณผ) -> O(N^2)

์ด ํ’€์ด๋Š” ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ๋Š” ํ’€์ด๋‹ค
ํ•˜์ง€๋งŒ ์•ž์˜ ๋‘ ํ’€์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ๋ฌด์‹ํ•˜๊ฒŒ ํ’€์–ด๋ณด์•˜๋‹ค

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-์˜คํฐ์ˆ˜-ํŒŒ์ด์ฌ

profile
๐Ÿฅ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ’ฐ

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด