728x90
반응형
Python 문제풀이
n = int(input()) # 수열의 요소 개수
x=[] # 입력받은 수열
y=[0] # 작업할 스택 공간, 0을 넣어준 이유는 y[-1]을 했을때 범위 오류 방지용
result=[] # +,- 등의 결과를 저장할 리스트
# 수열을 입력받는다
for i in range(n):
x.append(int(input()))
current=0 # push되는 스택의 현재 수
for i in range(n):
if y[-1]<x[i]: # 스택의 top에 위치한 값이 수열 값보다 작다면
while current<x[i]: # push되는 스택의 현재 수가 수열 값과 같아질때까지 push한다
current += 1
y.append(current) #push 작업
result.append('+')
y.pop() # 수열에 입력된 값이라는 뜻은 결국 pop을 당했던 것이기 때문에 해준다.
result.append('-')
elif y[-1]==x[i]: # 스택의 top에 위치한 값이 수열 값과 같다면
y.pop() # 그대로 pop해준다
result.append('-')
else: # 스택의 top에 위치한 값이 수열 값보다 크다면
print('NO') # 직접 해보면 알겠지만 이 경우가 NO를 출력해야하는 경우이다
exit()
for i in range(len(result)): # 결과를 출력한다
print(result[i])
1차로 문제 이해가 안가서 고전하다가 2차로 구현에서 고전했는데.. 뭐든 원리에서 답이 나오는것같습니다.
주석으로 설명을 쓰긴 했지만 핵심 부분을 설명하겠습니다.
- 수열에 입력된 값은 pop이 되면서 입력된 값들이다. 수열에 입력된 값에 도달하는 순간 그 값은 pop을 당해야 한다.
: 그렇기 때문에 수열이 현재 스택의 top 값보다 큰 값을 요청했다면 그 값까지 push를 한 뒤 pop을 한 번 당한것이다.
- push작업이 필요한게 아닌 경우라면 항상 top의 값과 수열의 요청값이 같을것이다.
: 이 문제에서는 push와 pop만 진행하는데 push작업이 필요한 경우는 수열이 현재 스택의 top 값보다 큰 값을 요청했을 경우이다. 더 추가를 해야하는 경우가 아니라면 빼는 pop 작업밖에 없다. 근데 스택은 빼는 작업을 항상 top에서만 진행하기 때문에 pop작업을 요청했다면 항상 top과 수열의 요청값이 같다.
- 그렇다면 수열에 입력된 값이 top 값보다 작은 경우는 어떻게 되는가?
: 그 경우가 스택이 깨지는 순간이다. 'NO'를 출력하면 된다. 스택은 top에있는 값만을 pop할 수 있는데 top 값을 무시하고 그 속에있는 값을 요청하는 꼴이기 때문이다.
728x90
반응형
'코딩문제풀이 > 백준' 카테고리의 다른 글
[백준 10773번] 제로 Python 풀이 (0) | 2021.07.09 |
---|---|
[백준 2941번] 크로아티아 알파벳 Python 풀이 (0) | 2021.07.09 |
[백준 1158번] 요세푸스 문제 Python 풀이 (0) | 2021.07.08 |
[백준 10845번] 큐 Python 풀이 (0) | 2021.07.08 |
[백준 10610번] 30 Python 풀이 (0) | 2021.07.08 |