백준/ Silver 3 문제 , 백준 파이썬 1874, 스택 수열
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
NO를 출력시키는 상황에 대한 조건을 생각해내는데 오래 걸렸던 문제이다. 진짜 오래 고민하고 풀어보다가 결국 맞췄다! ㅎㅎ check 배열을 가지고 이미 pop 된 숫자들을 출력시키라하면 NO를 출력시켜주는 방법으로 풀었음.
<문제 출처>
https://www.acmicpc.net/problem/1874
------------------------------------------------------------------------------------------------------------------------------
NO가 출력될 수도 있기에 +,- 는 바로 출력시키지 않고 리스트에 저장해둔 뒤 마지막에 한 번에 출력시킨다.
코드에 해설 작성
------------------------------------------------------------------------------------------------------------------------------
정답
import sys
input=sys.stdin.readline
n=int(input())
stack=[]
order=[]
check=[True]*(n+1)
for i in range(n):
num=int(input())
if check[num]==False: # 이미 pop 시킨 숫자가 나오면, 불가능한 경우이다.
order=['NO']
break
if i==0: # 첫번째로 받은 숫자는 크기만큼 스택에 쌓아준다.
tmp=num
for j in range(1,num+1):
stack.append(j)
order.append('+')
elif len(stack)==0: # 만약 pop을 시킨 후에 안이 비게 될 경우를 방지
for i in range(tmp+1,num+1):
stack.append(i)
order.append('+')
tmp=num
elif num>stack[-1]: # 입력 숫자가 스택 끝 숫자보다 클경우 쌓아주기
while num!=stack[-1]:
stack.append(tmp+1)
order.append('+')
tmp=tmp+1
if num==stack[-1]: # 스택 끝값이 찾는 값이면 pop 시키고, pop 되었다고 표시
a=stack.pop()
order.append('-')
check[a]=False
else: # 출력시킬값이 끝값이 아니면 값을 찾을때까지 pop
while num!=stack[-1]:
a=stack.pop()
order.append('-')
check[a]=False
for i in order:
print(i)
반응형
'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글
백준/ Silver 3 문제 , 백준 파이썬 10972 , 다음 순열 (0) | 2022.03.04 |
---|---|
백준/ Silver 2 문제 , 백준 파이썬 1912, 연속합 (0) | 2022.03.03 |
백준/ Gold 5 문제 , 백준 파이썬 2225 , 합분해 (0) | 2022.02.28 |
백준/ Silver 2 문제 , 백준 파이썬 4948, 베르트랑 공준 (0) | 2022.02.26 |
백준/ Silver 5 문제 , 백준 파이썬 1417 , 국회의원 (0) | 2022.02.25 |