https://www.acmicpc.net/problem/6198
이 문제는 "다음 큰(또는 같은) 수(Next Greater or Equal Element)" 문제다. 배열이나 리스트에서 각 원소에 대해 오른쪽에 있는 원소들 중 자신보다 크거나 같은(또는 보통은 '큰' 경우가 많지만, 변형으로 '크거나 같은' 조건을 쓰기도 한다) 첫 번째 원소를 찾는 문제이다.
1. 단순 탐색 풀이 - O(n^2)
from functools import reduce
import sys
input = sys.stdin.readline
N = int(input().strip())
heights = list(int(input().strip()) for _ in range(N))
def get_answer():
results = []
while heights:
height = heights.pop(0)
count = 0
for i in range(len(heights)):
if heights[i] < height:
count += 1
else:
break
results.append(count)
print(reduce(lambda acc, value: acc + value, results))
2. 스택 이용 최적화 풀이 - O(n)
from functools import reduce
import sys
input = sys.stdin.readline
N = int(input().strip())
heights = list(int(input().strip()) for _ in range(N))
def get_answer():
stack = []
total_visible = 0
for i in range(N - 1, -1, -1):
# 현재 빌딩보다 낮은 빌딩들은 스택에서 제거
while stack and heights[stack[-1]] < heights[i]:
stack.pop()
# 스택에 차단 빌딩이 있으면 그 위치까지 빌딩 수 계산
if stack:
visible = stack[-1] - i - 1
else:
# 오른쪽의 모든 빌딩이 보이는 경우
visible = N - i - 1
total_visible += visible
# 현재 빌딩 인덱스를 추가
stack.append(i)
return total_visible
print(get_answer())
- 스택을 활용하면 오른쪽에서 왼쪽으로 한 번의 순회로 각 빌딩의 보이는 옥상 수를 구할 수 있어 전체 시간복잡도를 O(n)으로 최적화할 수 있다.
- 이 방법은 각 빌딩이 스택에 단 한 번 들어가고 한 번씩만 제거되므로 효율적이다.
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 1158] 요세푸스 문제 - Python(큐, 링크드 리스트) (0) | 2025.03.11 |
---|---|
[백준 3015] 오아시스 재결합 - Python(스택) (0) | 2025.03.09 |
[백준 2493] 탑 - Python(스택) (0) | 2025.03.06 |
[백준 10866] 덱 - Python (Deque) (0) | 2021.05.20 |
[백준 7568] 덩치 - Python (브루트포스) (0) | 2021.05.17 |