์•Œ๊ณ ๋ฆฌ์ฆ˜/์„ ํ˜•๊ตฌ์กฐ

[๋ฐฑ์ค€ 1874 ๐Ÿฅˆ] ์Šคํƒ ์ˆ˜์—ด

1eehyunji 2023. 7. 31. 23:26

๋ฌธ์ œ

์Šคํƒ (stack)์€ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์ž์ฃผ ์ด์šฉ๋˜๋Š” ๊ฐœ๋…์ด๋‹ค. ์Šคํƒ์€ ์ž๋ฃŒ๋ฅผ ๋„ฃ๋Š” (push) ์ž…๊ตฌ์™€ ์ž๋ฃŒ๋ฅผ ๋ฝ‘๋Š” (pop) ์ž…๊ตฌ๊ฐ€ ๊ฐ™์•„ ์ œ์ผ ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„ ์ž๋ฃŒ๊ฐ€ ์ œ์ผ ๋จผ์ € ๋‚˜์˜ค๋Š” (LIFO, Last in First out) ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์Šคํƒ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ฝ‘์•„ ๋Š˜์–ด๋†“์Œ์œผ๋กœ์จ, ํ•˜๋‚˜์˜ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์Šคํƒ์— pushํ•˜๋Š” ์ˆœ์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ง€ํ‚ค๋„๋ก ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์Šคํƒ์„ ์ด์šฉํ•ด ๊ทธ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€, ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์ˆœ์„œ๋กœ push์™€ pop ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

์ž…๋ ฅ

์ฒซ ์ค„์— n (1 ≤ n ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n๊ฐœ์˜ ์ค„์—๋Š” ์ˆ˜์—ด์„ ์ด๋ฃจ๋Š” 1์ด์ƒ n์ดํ•˜์˜ ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ฌผ๋ก  ๊ฐ™์€ ์ •์ˆ˜๊ฐ€ ๋‘ ๋ฒˆ ๋‚˜์˜ค๋Š” ์ผ์€ ์—†๋‹ค.

์ถœ๋ ฅ

์ž…๋ ฅ๋œ ์ˆ˜์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ํ•œ ์ค„์— ํ•œ ๊ฐœ์”ฉ ์ถœ๋ ฅํ•œ๋‹ค. push์—ฐ์‚ฐ์€ +๋กœ, pop ์—ฐ์‚ฐ์€ -๋กœ ํ‘œํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ NO๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œํ’€์ด

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ ๋‚˜์„œ ๋ฌด์Šจ ๋œป์ธ์ง€ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋‹ค. 

์Šคํƒ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ push๋˜์–ด์•ผ ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋งŒ์•ฝ 4๋ฅผ ๋ฝ‘์•„๋‚ด์•ผ ํ•  ๊ฒฝ์šฐ ์•„์ง 1,2,3,4๋ฅผ ์ฐจ๋ก€๋กœ pushํ•ด์ค€ ๋’ค์— 4๊ฐ€ top์— ์œ„์น˜ํ•  ๋•Œ๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

4 3 6 8 7 5 2 1 ์„ ์˜ˆ๋กœ ๋“ค๋ฉด, 1,2,3,4๋ฅผ pushํ•˜๊ณ , 4๋ฅผ ๋ฝ‘์•„๋‚ธ ๋’ค์— ๋˜ 3์„ ๋ฝ‘์•„๋‚ธ ํ›„์— 5,6์„ pushํ•ด์ฃผ๊ณ  6์„ ๋ฝ‘์•„๋‚ธ ๋’ค์— 7,8์„ pushํ•ด์ฃผ๊ณ  ์ˆœ์„œ๋Œ€๋กœ 8,7,5,2,1์„ ๋ฝ‘์•„๋‚ด๋ฉด ๋œ๋‹ค.

import sys

n=int(sys.stdin.readline())
# ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ push๋˜๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌํ•  ๋ณ€์ˆ˜
cnt=0
stack=[]
ans=[]
for i in range(1,n+1):
    num=int(sys.stdin.readline())
    while cnt<num:
        cnt+=1
        stack.append(cnt)
        ans.append('+')
    if num==stack[-1]:
        stack.pop()
        ans.append('-')
    else:
        print('NO')
        sys.exit(0)

for a in ans:
    print(a)

์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ push๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ตœ๊ทผ์— pushํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” cnt ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.

๋จผ์ € ์–ด๋–ค ๊ฐ’์„ popํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž…๋ ฅ๋ฐ›์•„ num์— ์ €์žฅํ•˜๊ณ , cnt๊ฐ€ num๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—” ์ด๋ฏธ num๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ๋ชจ๋‘ pushํ•ด์คฌ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ top๊ณผ num์„ ๋น„๊ตํ•ด์„œ popํ•ด์ค€๋‹ค.

 

๋ฐ˜๋Œ€๋กœ, cnt๊ฐ€ num๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ cnt+1ํ•ด์ฃผ๊ณ  ์Šคํƒ์— pushํ•ด์ค€๋‹ค.

pushํ•ด์ค„ ๋•Œ๋งˆ๋‹ค ans ๋ฐฐ์—ด์— '+'๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. cnt๊ฐ€ num๊ณผ ๋™์ผํ•ด์ง€๋ฉด while๋ฌธ์„ ๋น ์ ธ๋‚˜์™€ stack์˜ top๊ณผ num์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ๋™์ผํ•˜๋‹ค๋ฉด popํ•ด์ฃผ๊ณ  '-'๋ฅผ ans ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ cnt๊ฐ€ num๊ณผ ๋™์ผํ•ด์ ธ์„œ ๋น ์ ธ๋‚˜์™”๋Š”๋ฐ top๊ณผ num์ด ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ์ˆ˜์—ด์€ ์ž…๋ ฅ๋œ ์ˆ˜์—ด์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ NO๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ans ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.