본문 바로가기
카테고리 없음

알고리즘 - Python / 백준 - 2493번 : 탑

반응형

2493번: 탑 (acmicpc.net)

 

2493번: 탑

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

www.acmicpc.net

 


풀이

  • 탑의 높이가 주어지고 , 왼쪽의 탑부터 왼쪽으로 레이저를 쏘아 그 레이저를 맞는 탑의 번호를 모두 구하는 문제다.
  • 이 문제 역시 스택을 이용하면 편하다.
  • 비슷한 문제로는 17298번 : 오큰수 가 있다.

 

알고리즘 - Python / 백준 - 17298번 : 오큰수 (tistory.com)

 

알고리즘 - Python / 백준 - 17298번 : 오큰수

17298번: 오큰수 (acmicpc.net) 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net..

ddggblog.tistory.com

 

  • 푸는 방법 역시 비슷하다.
  • 탑의 높이 리스트를 역순으로 읽으며 다음 과정을 반복한다.
  • 1. 다음 탑이 스택의 TOP 보다 높거나 같다면 , POP하고 그 탑의 레이저가 송신한 탑 (다음 탑)을 기록한다.
  • 2. 만약 스택의 TOP 보다 작다면 , 스택의 맨 위에 그 탑을 추가하고 while 문을 break 한다.
  • 1번 과정은 stack이 빌 때 까지 진행한다.
  • 스택을 활용하는 방식이 오큰수 문제와 상당히 유사하고 흡사한 문제다.

 

import sys
n = int(sys.stdin.readline())
s = list(map(int , sys.stdin.readline().split(" ")))
stack = [[s[-1],n-1]]
ans = [0 for i in range(n)]

for i in range(len(s)-2,-1,-1):
    check = True
    while stack:
        if stack[-1][0] <= s[i]:
            pp = stack.pop(-1)
            ans[pp[1]] = i + 1
        else:
            stack.append([s[i],i])
            check = False
            break
    if check:
        stack.append([s[i], i])

for i in range(0,len(ans)-1):
    print(ans[i],end=" ")
print(ans[len(ans)-1])

 

 

 

 

반응형