alpyrithm_알파이리즘

[알고리즘][Python] 백준(BOJ) 2493 탑_파이썬 본문

Algorithm/백준 알고리즘_Python

[알고리즘][Python] 백준(BOJ) 2493 탑_파이썬

알파이 2020. 9. 28. 08:43

 

2493 탑    www.acmicpc.net/problem/2493

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 ��

www.acmicpc.net

 

 

 

 

 

문제 풀기 전 공부할 것 : 자료구조, 스택

 

 

 

 

 

 

 

풀이 1

<내용>

  • 탑의 높이를 입력받는다.
  • 탑의 높이와 인덱스를 같이 저장한다.
  • 탑이 empty가 아니라면 수신할 수 있는 탑을 찾을 때까지 stk에 저장하고 있는다.
  • heapq를 이용해 높이가 낮은 탑부터 pop해서 계산을 여러 번 하지 않아도 되게 한다.

 

 

 

<코드>

import heapq

n = int(input())
height = list(map(int, input().split()))
height = [(i+1, j) for i, j in enumerate(height)]
res = [0 for _ in range(n)]
stk = []
while height:
    i, j = height.pop()
    if not height:
        break
        
    if stk and stk[0][0] <= height[-1][1]:
        while stk:
            if stk[0][0] <= height[-1][1]:
                q, p = heapq.heappop(stk)
                res[p-1] = height[-1][0]
            else:
                break
    
    if height[-1][1] >= j:
        res[i-1] = height[-1][0]
    else:
        heapq.heappush(stk, (j, i))
                

print(*res)

 

 

 

 

 

 

 

 

풀이 2

<내용>

  • 왼쪽부터 값을 읽으면 더 간단하게 문제를 해결할 수 있다.
  • 탑의 높이를 입력받는다.
  • 왼쪽의 탑이 현재 탑보다 작다면 오른쪽의 탑에서 수신은 현재 탑만 의미 있다.
  • 따라서 현재 탑보다 낮은 왼쪽 탑을 저장하지 않는 방법을 이용한다.

 

 

 

<코드>

n = int(input())
height = list(map(int, input().split()))
stk, res = [], []
for i in range(n):
    while stk:
        if stk[-1][1] < height[i]:
            stk.pop()
        else:
            break
    if stk:
        res.append(stk[-1][0]+1)
    else:
        res.append(0)
        
    stk.append((i, height[i]))
    
print(*res)

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments