반응형
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
[ 실패 코드 ] - 시간 초과
시간 초과의 이유를 살펴보니 index, slicing 을 사용하면 시간 초과가 났다고 한다. 나는 둘 다 사용하지 않았지만 시간초과가 났다. 뒤에서부터 비교 -> 앞에서부터 비교로 바꾸고 코드 구성을 바꿔줬더니 통과하였다. 시간초과...해결하기 너무 어렵다....
n = int(input())
towers = list(map(int, input().split()))
stack = [(t, i+1) for i, t in enumerate(towers)]
answer = []
while stack:
now = stack.pop()
for i in range(len(stack)-1, -1, -1):
next, idx = stack[i]
if now[0] <= next:
answer.append(idx)
break
else:
answer.append(0)
print(*answer[::-1])
[ 성공 코드 ]
n = int(input())
towers = list(map(int, input().split()))
stack = []
answer = [0] * n
for i in range(n):
while stack:
if stack[-1][0] > towers[i]:
answer[i] = stack[-1][1] + 1
break
else:
stack.pop()
stack.append((towers[i], i))
print(*answer)
1. 답을 담는 리스트 answer 를 생성하고 0으로 초기화한다.
2. 모든 타워를 앞에서부터 비교하는 과정을 반복한다.
2-1. stack에 값이 없으면 stack에 현재 타워를 추가한다.
2-2. stack에 값이 있으면 이전 타워를 하나씩 가져와 비교한다.
2-3. 이전 타워가 현재 타워보다 크다면 신호를 수신할 수 있는 것이므로 답을 이전 타워의 번호로 바꾼다.(번호가 1부터 시작하므로 +1을 해주는 것!)
2-4. 이전 타워가 현재 타워보다 크지 않다면 스택에서 이전 타워를 없앤다.
3. 답을 출력한다.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준/Python] 토마토 (0) | 2021.11.18 |
---|---|
[백준/Python] 단지번호붙이기 (0) | 2021.11.15 |
[백준/Python] 결혼식 (0) | 2021.11.12 |
[백준/Python] 1로 만들기 (0) | 2021.11.10 |
[백준/Python] 포도주 시식 (0) | 2021.11.07 |