BOJ17608 막대기

Hoeun Lee·2021년 9월 11일
0

백준 알고리즘 풀이

목록 보기
31/34
post-thumbnail

문제

BOJ17608 막대기
브론즈II | 백준 17608 | Python3 파이썬 풀이


알고리즘

한 쪽에서 보았을 때 볼 수 있는 막대를 세어보자.

일단 맨 처음 막대는 무조건 볼 수 있다.

어떤 막대를 볼 수 있는 조건은 무엇일까? 막대를 1번부터 NN개까지 세어갈 때, 어떤 막대의 순서가 cc번째이고, 그 막대의 길이가 hch_c라면,

위 상태에서 cc번째 막대는 볼 수 없다. 4번 막대가 더 크기 때문에 가려진다.

이를 공식으로 나타내면 어떤 막대를 볼 수 있는 조건은
hc>hi,i={x1<=x<c}h_c > h_i, i=\{x|1<=x<c\}이다. 즉, 그 막대 앞쪽에 더 큰 막대가 없어야 한다.

즉 해당 막대를 볼 수 있는지 체크하려면 그 막대 앞에 더 큰 막대가 있는지 검사한다.

이를 방향을 오름차순으로 생각하면, 어떤 ii에 대해 (i={x1<=x<c}i=\{x|1<=x<c\}) 높이가 가장 큰 막대를 hmaxh_{max}라고 할 때 어떤 막대 cc의 높이 hch_chmaxh_{max}보다 크다면, hmax>=hi,i={x1<=x<c}h_{max} >= h_i, i=\{x|1<=x<c\}가 성립하고, 이로 인해 hc>hi,i={x1<=x<c}h_c > h_i, i=\{x|1<=x<c\} 공식이 성립한다.

즉 간단하게 말해서, 어떤 막대가 보이는 조건은 그 막대 앞에 그 막대보다 큰 막대가 없어야 한다.


코드

import sys

input = sys.stdin.readline

N = int(input())

heights = [int(input()) for _ in range(N)][::-1]

# 가장 큰 높이 저장
m = heights[0]
# 볼 수 있는 막대 수
# 맨 앞 막대는 무조건 볼 수 있다.
count = 1

for height in heights:
	# 현재 막대가 이전 모든 막대보다 크면
    if height > m:
    	# 현재 막대를 볼 수 있다.
        count += 1
        # 가장 큰 막대 높이 수정
        m = height

print(count)

결과

profile
건국대학교 컴퓨터공학부 이호은 | 알고리즘 정리 블로그

0개의 댓글