아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.
N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.
첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.
오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.
import sys
N = int(sys.stdin.readline().strip())
heights = [int(sys.stdin.readline().strip()) for _ in range(N)]
count = 1
max_height = heights[-1]
for i in range(N - 2, -1, -1):
if heights[i] > max_height:
count += 1
max_height = heights[i]
print(count)
막힘 없이 완전히 풀었으나 코드가 깔끔하지 못해서 어떻게 하면 더 깔끔하게 작성할 수 있을까 고민을 많이 했다.
for
문을 이용해서 받아오는 것을 heights = [int(sys.stdin.readline().strip()) for _ in range(N)]
을 통해 한 번에 받아왔다. 그리고 오른쪽 막대기는 항상 보일 수 밖에 없으니까 보이는 막대의 높이 기준을 인덱스 -1을 통해 설정하며, count
도 1로 기준을 잡는다.
가장 중요한 부분은 오른쪽에서 왼쪽으로 탐색하면서 현재 막대기의 높이가 오른쪽 막대보다 높으면 count
에 값을 더하고 기준 높이 max_height
을 새로 갱신한다.
strip()
: 문자열 양쪽에 있는 공백을 제거하는 역할을 한다. sys.stdin.readline()
만 있으면 개행 문자가 포함되어 오류가 발생한다.
for i in range(start, stop, step)
: 순서대로 시작 값, 종료 값, 증감 값만큼 반복문을 전개한다.
for i in range(N - 2, -1, -1):
if heights[i] > max_height:
count += 1
max_height = heights[i]
위와 같이 작성하면 인덱스의 마지막 부분부터 시작하여 리스트를 역순으로 탐색할 때 효과적이다.