알고리즘 연습/스택

[🥉2 / 백준 17608 / 파이썬] 막대기

김세진 2022. 1. 29. 23:36
반응형

 

 

17608번: 막대기

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로

www.acmicpc.net

 

문제

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.

N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.

입력

첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.

출력

오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.

 

예제 입력 1

6
6
9
7
6
4
6

예제 출력 1

3






예제 입력 2

5
5
4
3
2
1

예제 출력 2

5





 

풀이

 

단순 선형 탐색 문제라 스택을 무조건 써야 풀리는 것은 아니지만, 좋은 풀이 방법 중 하나라고 생각한다.

필자는 스택 방식으로 접근하였으므로 해당 풀이 방법을 첨부한다.

 

맨 뒤의 막대기 길이를 최솟값으로 두고 차례로 뒤에서부터 탐색한다.

최솟값보다 더 큰 길이의 막대기가 나온다면 최솟값을 그 막대기로 갱신하고 카운트 변수를 증가시킨다.

탐색이 완료되었다면 카운트 변수를 출력한다.

 

import sys
input = sys.stdin.readline

arr = [int(input()) for _ in range(int(input()))]
maxx = arr.pop()
ans = 1
for i in range(len(arr)):
    n = arr.pop()
    if n > maxx:
        ans+=1
        maxx = n
print(ans)
반응형