BOJ/๐Ÿฅˆ

โ˜…Stack & Queue & Deque Upper-Intermediate I - 11 Solvedโ˜…

metamong 2023. 1. 8.

โ˜… 1874 ์Šคํƒ ์ˆ˜์—ด โ˜…

 

import sys
input = sys.stdin.readline

stack,sequence,ans = [],[],[]
cur = 0

for _ in range(int(input())):
    sequence.append(int(input()))

sequence = sequence[::-1]

while len(sequence) != 0:
    popped = sequence.pop()
    if popped > cur:
        for i in range(cur+1,popped+1):
            stack.append(i)
            ans.append('+')
        cur = popped
    
    if popped == stack[-1]:
        stack.pop()
        ans.append('-')
    else:
        ans = []
        break

if len(ans) != 0:
    for i in ans:
        print(i)
else:
    print('NO')

 

 

๐Ÿซถ ์ฃผ์–ด์ง„ stack์— ์ž…๋ ฅํ•œ ์ˆ˜์˜ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€ ๋ฌป๋Š” ๋ฌธ์ œ. 4๊ฐ€ ๋จผ์ € ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 1 - 2 - 3 - 4 ์ฐจ๋ก€๋Œ€๋กœ push. (pushํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค) ๊ทธ ๋‹ค์Œ push๋œ stack์—์„œ popํ•˜๋ฉด ํ•ด๋‹น pop๋œ ์›์†Œ(popped)๊ฐ€ ์ˆ˜์—ด์˜ ์›์†Œ. ์œ„ 1-2 ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋˜, pop๋œ ๊ฒฐ๊ณผ๊ฐ€ ์›ํ•˜๊ณ ์ž ํ•˜๋Š” ์ˆ˜์—ด์˜ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ  NO ์ถœ๋ ฅ. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋Œ€๋กœ push / pop ๊ตฌํ˜„๋งŒ ์ž˜ํ•˜๋ฉด ๋จ.


โ˜… 4889 ์•ˆ์ •์ ์ธ ๋ฌธ์ž์—ด โ˜…

 

import sys
input=sys.stdin.readline

num=0
while 1:
    num+=1
    left,right=0,0
    parentheses=input().strip()
    stack=[]
    if '-' in parentheses:break

    #stack operation
    for p in parentheses:
        if len(stack)!=0:
            if p=='}' and stack[-1]=='{':stack.pop()
            else:stack.append(p)
        else: stack.append(p)
    
    if len(stack)==0:print(f'{num}. 0')
    
    else:
        left=stack.count('{')
        right=stack.count('}')
        
        if left==0:print(f'{num}. {(right//2)}')
        
        elif right==0:print(f'{num}. {(left//2)}')
        
        else:
            if left%2==1:print(f'{num}. {(left//2 + right//2 + 2)}')
            else:print(f'{num}. {(left//2 + right//2)}')

 

๐Ÿซถ ์•ˆ์ •์ ์ธ ๋ฌธ์ž์—ด์ž„์„ ํ™•์ธํ•  ๋•Œ stack์„ ์„ ํ™œ์šฉํ•˜๋Š” ์ „ํ˜•์ ์ธ stack ๋ฌธ์ œ ์œ ํ˜•. 'pair๋ฅผ ํ˜•์„ฑํ•˜๋Š”์ง€ ํ™•์ธ - pair๊ฐ„์˜ ๊ฒฐํ•ฉ ๊ฒฐ๊ณผ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ˜•์„ฑ๋˜๋Š” ์ง€ ํ™•์ธ' ๋Œ€๋กœ ๊ทธ๋Œ€๋กœ stack์œผ๋กœ ๊ฒ€์‚ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ถ”๊ฐ€๋กœ, ๋งŒ์•ฝ stack์— ์†Œ๊ด„ํ˜ธ๊ฐ€ ๋‚จ์•˜์„ ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์ง์ˆ˜ ๊ฐœ์ˆ˜๋กœ ๋‚จ๊ฒŒ ๋˜๊ณ , { ๋‚˜ } ํ•œ ์ข…๋ฅ˜๋งŒ ๋‚จ์•˜๋‹ค๋ฉด 2๋กœ ๋‚˜๋ˆˆ ๋ชซ์ด ์ตœ์†Œ ๋ฐ”๊พธ๋Š” ํšŸ์ˆ˜ + {์™€ }๊ฐ€ ๊ฐ™์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ฐ๊ฐ ํ™€์ˆ˜ ๊ฐœ์ˆ˜์ผ ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ 2๋กœ ๋‚˜๋ˆˆ ๋ชซ์„ ์„œ๋กœ ๋”ํ•˜๊ณ , }์™€ {๊ฐ€ ๋‚จ์œผ๋ฏ€๋กœ ๊ฐ๊ฐ {์™€ }๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ฐ์‚ฐ ํšŸ์ˆ˜ 2๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค / ๊ฐ๊ฐ ์ง์ˆ˜ ๊ฐœ์ˆ˜์ผ ๊ฒฝ์šฐ, ๊ฐ๊ฐ์˜ 2๋กœ ๋‚˜๋ˆˆ ๋ชซ๋งŒ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.(case์— ๋”ฐ๋ผ ์ตœ์†Œ ์—ฐ์‚ฐ์˜ ์ˆ˜ ๊ณ ๋ ค) 


โ˜… 1406 ์—๋””ํ„ฐ โ˜…

 

import sys
input=sys.stdin.readline

#queue
from collections import deque

x=deque(input().rstrip())
y=deque([])
for _ in range(int(input())):
    ord=input().split()
    if ord[0] == 'P':
        x.append(ord[1])
    elif ord[0] == 'L':
        if x:
            y.appendleft(x.pop())
    elif ord[0] == 'D':
        if y:
            x.append(y.popleft())
    else: #B
        if x:
            x.pop()
print(*(x+y),sep='')

 

๐Ÿซถ ์ปค์„œ๋ฅผ ์•ž๋’ค๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ์ปค์„œ๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ์ปค์„œ ์•ž๊ณผ ๋’ค์— 2๊ฐœ์˜ deque์ด ์žˆ๋Š” idea๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ. ์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊ธฐ๋Š” ๊ฑด ์™ผ์ชฝ deque์„ popํ•ด ์˜ค๋ฅธ์ชฝ deque์— appendleft. ์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊ธฐ๋Š” ๊ฑด ์˜ค๋ฅธ์ชฝ deque์„ popleftํ•ด ์™ผ์ชฝ deque์— append. ์ปค์„œ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌธ์ž ์‚ญ์ œ๋Š” ์™ผ์ชฝ deque pop. ์ปค์„œ ์™ผ์ชฝ์— ๋ฌธ์ž ์ถ”๊ฐ€๋Š” ์™ผ์ชฝ deque append. ์ด ๋•Œ pop(), popleft() ๋•Œ deque์— ์›์†Œ๊ฐ€ ์—†๋Š” ์ง€ ์žˆ๋Š” ์ง€๋งŒ ์—ฌ๋ถ€ ํ™•์ธ


โ˜… 5397 ํ‚ค๋กœ๊ฑฐ โ˜…

 

import sys
input=sys.stdin.readline
from collections import deque

for _ in range(int(input())):
    string=input().rstrip()
    x,y=deque(),deque()
    for s in string:
        if s == '<':
            if x:
                y.appendleft(x.pop())
        elif s == '>':
            if y:
                x.append(y.popleft())
        elif s == '-':
            if x:
                x.pop()
        else:
            x.append(s)
    print(*(x+y),sep='')

 

๐Ÿซถ ์œ„ 1406 ์—๋””ํ„ฐ idea ๋ฐœ์ƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ. deque ๋Œ€์‹  stack 2๊ฐœ ํ™œ์šฉ๋„ ๊ฐ€๋Šฅ. ๋‹ค๋งŒ ๋‚˜์ค‘์— ์ถœ๋ ฅ ์‹œ ์ž…๊ตฌ/์ถœ๊ตฌ ๊ตฌ๋ณ„ํ•ด์„œ stack reverse ์ฃผ์˜


โ˜… 26111 Parentheses Tree โ˜…

 

import sys
input=sys.stdin.readline
parentheses,stack=input(),[]
ans=0
flag=False
for p in parentheses:
    if not stack: stack.append(p)
    else:
        if p=='(':
            stack.append(p)
            flag=True
        else: #')'
            stack.pop()
            if flag: 
                ans += len(stack)
                flag=False

        
print(ans)

๐Ÿซถ ( ๋งŒ๋‚  ๋•Œ stack์— ๋„ฃ๊ณ  ) ๋งŒ๋‚  ๋•Œ ์ด๋ฏธ ์•ž์— ๋ฐ”๋กœ (๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ( ์—†์• ๊ณ  ํ˜„์žฌ  stack์— ๋“ค์–ด๊ฐ„ (์˜ ๊ฐœ์ˆ˜ ์นด์šดํŠธ. ์œ„ ์ ์„  ์›๋งŒ ์นด์šดํŠธํ•˜๋ฏ€๋กœ ๋”ํ•ด์ง€๋Š” ์ˆซ์ž๋Š” ์œ„์˜ ( ๊ฐœ์ˆ˜. ์ด๋Š” ๊ณง len(stack). ํ™”์‚ดํ‘œ ์ˆœ์„œ๋Œ€๋กœ stack์— append(), pop() ๋ฐ˜๋ณต


โ˜… 6105 Look Up โ˜…

 

#monotone stack
import sys
input=sys.stdin.readline

N=int(input())
stack=[]
ans=[0]*(N+1)
for i in range(1,N+1):
    n=int(input())
    while stack:
        if stack[-1][1]<n:
            popped = stack.pop()
            ans[popped[0]]=i
        else:
            break
    stack.append((i,n))
print(*ans[1:],sep='\n')

 

๐Ÿซถ ์Šคํƒ ๊ธฐ์ค€ ๊ณ„์† ๋“ค์–ด์˜ค๋Š” ์ˆซ์ž ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜๋ณด๋‹ค ๋†’์€ ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๋Š” ์†Œ์˜ index๋ฅผ ๋ชจ๋“  ์†Œ๋งˆ๋‹ค ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. ์ด๋Š” ์Šคํƒ <๋ชจ๋…ธํ†ค ์Šคํƒ> ์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์Šคํƒ์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋ชจ๋…ธํ†ค ์Šคํƒ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์œผ๋กœ ์‘์šฉํ•  ์ˆ˜ ์žˆ์Œ. ์˜ค๋ฆ„์ฐจ์ˆœ์ด ํ™•์ธ๋˜๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ์ด ๋˜๊ธฐ ์ „ while stack๋ฌธ์„ ๊ณ„์† ๋Œ๋ ค ๋“ค์–ด์˜จ cow์˜ index๋กœ pop๋˜๋Š” cow์˜ ans ๋ณ€์ˆ˜๋ฅผ update.


โ˜… 25096 Pancake Deque โ˜…

 

import sys
input=sys.stdin.readline
from collections import deque

for i in range(1,int(input())+1):
    N=int(input())
    dq=deque(map(int,input().split()))
    ans=0
    cur=0
    for j in range(N):
        if j!=(N-1):
            x,y=dq.popleft(),dq.pop()
            if x<=y:#get x
                dq.append(y)
                if x>=cur:
                    cur=x
                    ans+=1
            else:#get y
                dq.appendleft(x)
                if y>=cur:
                    cur=y
                    ans+=1
        else:
            x=dq.pop()
            if x>=cur:
                ans+=1
    
    print(f'Case #{i}: {ans}')

 

๐Ÿซถ ์ผ๋‹จ ์–‘์ชฝ์—์„œ ๊บผ๋‚ด๊ณ , ์–‘์ชฝ ์ค‘ deliciousness๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ์„ ํƒ(greedy)ํ•ด ์„œ๋น™. ํ˜„์žฌ cur๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์—…๋ฐ์ดํŠธํ•ด์„œ ans ๊ฐœ์ˆ˜ += 1. ๋งจ ๋งˆ์ง€๋ง‰ 1๊ฐœ ๋‚จ์•˜์„ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ๊บผ๋‚ด์„œ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ์œ„์™€ ๋™์ผํ•˜๊ฒŒ cur๊ณผ ๋น„๊ต 


โ˜… 2346 ํ’์„  ํ„ฐ๋œจ๋ฆฌ๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline
from collections import deque

N=int(input())
balloons=list(map(int,input().split()))
ans=[]
dq=deque([(i,balloons[i-1]) for i in range(1,N+1)])
for _ in range(N):
    balloon = dq.popleft()
    ans.append(balloon[0])
    num=balloon[1]
    if len(dq)>=2:
        if num > 0: # +
            for _ in range(num-1):
                dq.append(dq.popleft())       
        else: #- (no 0)
            for _ in range(abs(num)):
                dq.appendleft(dq.pop())
print(*ans)

 

๐Ÿซถ ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋Œ๊ณ  / ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์™ผ์ชฝ์œผ๋กœ ๋„๋Š”, ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๊ธฐ์— deque ์‚ฌ์šฉ. ์ด ๋•Œ ํ’์„ ์„ ํ„ฐ๋œจ๋ฆฌ๊ณ  ๋‚œ ๋‹ค์Œ์—๋Š” ์ž๋™์œผ๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1์นธ ์›€์ง์ธ ํ’์„ ์ด deque์˜ ๋งจ ์•ž์— ์žˆ์œผ๋ฏ€๋กœ, ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ num-1๋ฒˆ ๋Œ๊ณ  / ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ abs(num)๋ฒˆ ๋Œ๋ฆฌ๋Š” ๊ตฌํ˜„ idea๋ฅผ ์ƒ๊ฐํ•ด์•ผ ํ•จ. ์ถ”๊ฐ€๋กœ deque์— ํ’์„ ์ด 1๊ฐœ ๋‚จ์•˜์„ ๊ฒฝ์šฐ, ๋‚จ์€ ํ’์„ ์˜ ์Šคํ… ๋ฒˆํ˜ธ๋Š” ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ์ข…๋ฃŒ.


โ˜… 24511 queuestack โ˜…

 

import sys
input=sys.stdin.readline
from collections import deque

N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
M=int(input())
C=list(map(int,input().split()))

ans=[]
dq=deque()
for a,b in zip(A,B):
    if a == 0:
        dq.append(b)

for c in C:
    dq.appendleft(c)
    ans.append(dq.pop())

print(*ans)

 

๐Ÿซถ stack์€ ๋„ฃ๊ณ  ๋นผ๋ฉด ์ž๊ธฐ ์ž์‹ ์ด ๋„ฃ๊ณ  ๋น ์ง€๋ฏ€๋กœ ์˜ํ–ฅ  x / queue๋Š” ๋‚ด๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ์›๋ž˜ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” queue์˜ ์›์†Œ๊ฐ€ ๋‚˜์˜ด. ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ queue๋งŒ ์—ฐ๊ฒฐ๋œ ๊ฑฐ๋Œ€ํ•œ deque 1๊ฐœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Œ. queue์˜ ์›์†Œ๋งŒ ๋ชจ์•„์„œ ํฐ 1๊ฐœ์˜ deque์œผ๋กœ ๋งŒ๋“ค๊ณ , deque์˜ ์™ผ์ชฝ์— ๋„ฃ์œผ๋ฉด์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1๊ฐœ์”ฉ ๋นผ๋ฉด ๋! ์ฆ‰, stack ์ œ์™ธ queue๋งŒ ์ผ์ง์„ ์œผ๋กœ ๋ชจ์•„์„œ 1๊ฐœ์˜ deque์œผ๋กœ appendleft()์™€ pop() ์—ฐ์‚ฐ


โ˜… 12789 ๋„ํ‚ค๋„ํ‚ค ๊ฐ„์‹๋“œ๋ฆฌ๋ฏธ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
s1=list(map(int,input().split()))
s1=s1[::-1]
order = 1
s2=[]

while s1:
    if order == s1[-1]:
        s1.pop()
        order+=1
        if order>N:
            print('Nice')
            sys.exit()
    else:
        while s2:
            if order == s2[-1]:
                s2.pop()
                order+=1
                if order>N:
                    print('Nice')
                    sys.exit()
            else:
                break
        s2.append(s1.pop())
if s2[::-1] == [x for x in range(order,N+1)]:
    print('Nice')
else:
    print('Sad')

 

๐Ÿซถ ๋‘ ๊ฐœ์˜ ์Šคํƒ์„ ํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ. ์ผ๋‹จ s1์„ ๋นผ๋ฉด์„œ order ๋งž๋‹ค๋ฉด ๋ฐ”๋กœ ๋นผ๊ณ  order +=1 / order ํ‹€๋ฆฌ๋‹ค๋ฉด s2๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ order์— ๋งž๋Š” ์ง€ ๊ณ„์† ํ™•์ธ / s2๊นŒ์ง€ ๋‹ค ๋Œ๋ ธ๋‹ค๋ฉด s2์— s1.pop() ๋„ฃ๊ธฐ / ์˜ˆ์™ธ์ ์œผ๋กœ s1 ๋ชจ๋‘ ๋นผ๊ณ  ๋‚œ ๋’ค s2์— ๋‚จ์€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์ค„ ๋ฒˆํ˜ธ์™€ ๋งž๋‹ค๋ฉด Nice ์ถœ๋ ฅ / ํ•œ stack ๋‚ด์— while ๋˜ ๋‹ค๋ฅธ stack ๋ฌธ ๋Œ๋ฆฌ๊ธฐ ๊ธฐ์–ต


โ˜… 15500 ์ด์ƒํ•œ ํ•˜๋…ธ์ด ํƒ‘ โ˜…

import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))
B=[]
K=0
moves=[]
while N>0:
    if A and A[-1] == N:
        A.pop()
        K+=1
        moves.append((1,3))
        N-=1
        continue
    if B and B[-1] == N:
        B.pop()
        K+=1
        moves.append((2,3))
        N-=1
        continue
    if N in A:
        while A[-1] != N:
            B.append(A.pop())
            K+=1
            moves.append((1,2))
        A.pop()
        K+=1
        moves.append((1,3))
        N-=1
    else:
        while B[-1] != N:
            A.append(B.pop())
            K+=1
            moves.append((2,1))
        B.pop()
        K+=1
        moves.append((2,3))
        N-=1
print(K)
for x in moves:
    print(*x)

 

๐Ÿซถ ๋ฐ˜๋“œ์‹œ ๋ฌด๊ฒŒ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋…ธ์ด ํƒ‘์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์—†์œผ๋ฏ€๋กœ, ๊ทธ์ € ๊ฐ€์žฅ ๋ฌด๊ฒŒ๊ฐ€ ๋งŽ์ด ๋‚˜๊ฐ€๋Š” ์›ํŒ์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ pop() + append() ๋ฐ˜๋ณตํ•˜๋ฉฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ์ตœ์ข… ๋ง‰๋Œ€์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.(์ด ๋•Œ list์— ์—†๋Š” ๊ฒฝ์šฐ๋งŒ ์ฃผ์˜ ์œ„ํ•ด A and A[-1] == N ์ด๋ ‡๊ฒŒ ๋‘ ์กฐ๊ฑด and๋กœ ๊ฒฐํ•ฉ


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€