백준 문제풀이/자료구조

[백준] 2493 탑 - python

peach_h 2023. 1. 27. 17:20

https://www.acmicpc.net/problem/2493

 

2493번: 탑

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

www.acmicpc.net

골드인데 할만해보여서 덤볐다가 교수님과 2시간 잡고 있었다.

무지랭이를 도와주시려고 계속 옆에서 알려주신 교수님께 이영광을

 

내가(교수님의도움을받아^^) 푼 코드

num = int(input())
li = list(map(int,input().split()))
temp = []
ans =[]

for j in range(len(li)):
    # 첫번째 숫자는 무조건 0
    flag = True
    for i in range(j-1, -1, -1):
        if li[i] > li[j]:
            flag = False
            ans.append(i+1)
            break
    if flag:
        ans.append(0)
 
print(*ans)

li의 인덱스보다 인덱스가 작은 값들과 계속 크기를 비교하고,

li[i]보다 앞 인덱스에서 값이 큰 수가 있으면, 그 수의 인덱스+1을  ans에 추가하는 방식

만약 이 반복문에 들어가지 않았다 = 앞 인덱스에 더 큰 숫자가 없었다면 ans에 0을 추가

굉장히 간단해보이는 코드지만 여기까지 오는데 정말 힘들었따

그러나 골드는 골드였다

시간초과에 바로 걸려버린 ^^

 

그래서 찾아봤더니 그냥 stack으로 푸는 문제였다.

stack문제만 하루종일 풀어놓고, stack 쓸 생각을 안하다니 난 정말 밥오다

 

1. stack에 아무것도 없을 때,  li[i]를 추가한다

2. li[i]와 stack의 가장 마지막 값의 크기를 비교한다

3. if li[i]가 더 크다면 -> stack의 마지막 값을 제거 + stack에 li[i] 값을 추가

else stack의 마지막 값이 li[i]보다 크다면 -> stack에 li[i]를 추가 + ans에 (더 컸던 수의 index+1)을 추가

4. stack이 비어있으면 항상 li[i]를 stack에 추가함

num = int(input())
li = list(map(int,input().split()))
stack = []
ans = [0]*num
for i in range(num):
    if stack :
        while True:
            if li[i] <= stack[-1][0]:
                ans[i] = stack[-1][1] + 1
                stack.append([li[i], i])
                break
            else : 
                stack.pop()
            if not stack :
                stack.append([li[i], i])
                break
    else:
        stack.append([li[i], i])

print(*ans)

이해가 잘안되서 하나하나 손으로 써가면서 이해하려구 노력함 . .

i = 0

stack=[6]

ans = [0, 0, 0, 0, 0]

 

i = 1

stack = [6]

9 > stack[-1] -> stack.pop() -> stack.append(9)

stack = [9]

ans = [0, 0, 0, 0, 0]

 

i = 2

stack = [9]

5 < stack[-1] -> stack.append(5) -> ans[i].append(9의 인덱스 + 1)

stack = [9, 5]

ans = [0, 0, 2, 0, 0]

 

i = 3

stack = [9, 5]

7 > stack[-1] = 5 -> stack.pop()

stack = [9]

7 < stack[-1] = 9 -> stack.append(7) -> ans[i].append(9의 인덱스 +1)

stack = [9, 7]

ans = [0, 0, 2, 2, 0]

 

 

i = 4

stack = [9, 7]

4 < stack[-1] = 7 -> stack.append(4) -> ans.append(7의 인덱스 + 1 )

stack = [9, 7, 4]

ans = [0, 0, 2, 2, 4]

 

손으로 써봤지만, 역시 아직 내 머리만으로 이걸 이해하기에는 어려운 것 같다.

stack 공부를 좀 더해야할듯하다

역시 gold의 벽은 높다 . .

 

 

 

참고한 블로그

https://fre2-dom.tistory.com/201

 

[baekjoon] 백준 2493번(파이썬): 탑

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

fre2-dom.tistory.com