https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
풀이
n=int(input())
height=list(map(int,input().split()))
tower_count=len(height)
stack=[]
res=[]
for i in range(tower_count):
while stack:
if stack[-1][1]>height[i]:
res.append(stack[-1][0]+1)
break
else:
stack.pop()
if not stack:
res.append(0)
stack.append([i,height[i]])
print(" ".join(map(str,res)))
-stack에 집어 넣는 자료 형태
stack.append([i,height[i]])
height 리스트의 몇 번째 수인지와 그 수의 값을 모두 넣으므로 res에 위치 값을 넣기에 수월하다.
또한
if stack[-1][1]>height[i]:
res.append(stack[-1][0]+1)
break
이 코드처럼 코드로 표현하기도 수월하다
-스택에 쓸모있는 자료만 넣기/ 불필요한 값은 pop
while stack:
if stack[-1][1]>height[i]:
res.append(stack[-1][0]+1)
break
else:
stack.pop()
while문을 잘 사용하는 것은 중요하다. 위 경우에서는 스택에 있는 탑과 height의 i번째 탑과
높이를 비교해서 만약 후자보다 높이가 높다면 그 순간을 결과값에 넣고 break한다.
하지만 만약 존재하지 않는다면 i번째 탑이 stack의 탑들보다 더 높다는 의미이므로
스택의 탑들은 존재가치가 없다. 따라서 else문에서 pop을 시킨다.
또한 발사한 레이저가 아무 탑에도 부딪히지 않으므로 결과값에
0을 집어넣어야 한다
if not stack:
res.append(0)
그 후 순차적으로 또 값을 집어넣는다.-->stack.append([i,height[i]])
정렬 문제 (0) | 2021.10.28 |
---|---|
백준 9935 문자열폭발 python (0) | 2021.09.02 |
Boj 1991 트리 순회 python (0) | 2021.07.29 |
Boj 15828 Router python (0) | 2021.07.23 |
Boj 큐2 python (0) | 2021.07.23 |
댓글 영역