Programming/백준

백준 17608 - 막대기 (파이썬)

pental 2025. 3. 21. 22:03

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

풀이

여러개의 막대기가 일렬로 세어져 있을 때, 오른쪽에서 보았을때 보이는 막대기의 개수를 구하는 문제이다.

  • 막대기는 왼쪽에서 오른쪽으로 나열되어 있으며, 각 막대기의 높이가 주어진다.
  • 오른쪽에서 왼쪽을 바라볼 때, 더 높은 막대기가 나오지 전까지의 막대기만 보이게 된다.
for i in range(N - 1, -1, -1):  # 오른쪽에서 왼쪽으로 순회
    if max_height < H[i]:  # 현재 막대기가 기존 최고 높이보다 높으면
        max_height = H[i]  # 최고 높이 갱신
        count += 1  # 보이는 막대기 개수 증가

오른쪽에서 왼쪽으로 막대기 리스트를 탐색한다.

만약 현재 막대기의 높이가 max_height 보다 크다면, 이는 새로운 보이는 막대기 이므로, count를 증가시킨다.

max_height를 현재 막대기의 높이로 갱신한다.

시간 복잡도 분석

  • 한번의 순회만 이용하므로 O(N)

코드

# 백준 17608 - 막대기
# 분류 : 구현

import sys
input = sys.stdin.readline

N = int(input())
H = [0] * N

for i in range(N) :
    H[i] = int(input())

max_height = 0
count = 0
for i in range(N - 1, -1, -1) :
    if max_height < H[i] :
        max_height = H[i]
        count += 1

print(count)