본문 바로가기
알고리즘

[BAEKJOON] 17608 막대기

by mAlfred 2024. 1. 8.
반응형

문제

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 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
n = int(sys.stdin.readline().strip())

p = sys.stdin.readlines()
p = list(map(int, p))

v = p[-1]

p.sort(reverse=True)

print(len(p[:p.index(v)+1]))

 

그래서 소트를 시켜 해당 값 위치를 알아내 슬라이싱으로 그 해당 요소 갯수를 세는 것으로 풀이하려고 하였으나 틀림이 떳다.

 

그래서 두번 째로 아! 소트를 시키면 잘못 세질 확률도 있음을 깨달았다.

 

import sys
n = int(sys.stdin.readline().strip())

p = sys.stdin.readlines()
p = list(map(int, p))

v = p[-1]

# p.sort(reverse=True)

# print(len(p[:p.index(v)+1]))

cnt = 1

for i in p:
    if v < i:
        cnt += 1

print(cnt)

 

그러나 틀림이 떠서 문제 접근을 잘못하고 있음을 깨닫고 다시 생각해보니 큰 것은 뒤에 것은 세지지 않다는 경우를 생각하게되어 코드를 수정했다.

 

import sys
n = int(sys.stdin.readline().strip())

p = sys.stdin.readlines()
p = list(map(int, p))
p = p[::-1]
v = p[0]

cnt = 1

for i in p:
    if v < i:
        v = i
        cnt += 1

print(cnt)
반응형

'알고리즘' 카테고리의 다른 글

[BAEKJOON] 2587 대표값2  (0) 2024.01.10
[BAEKJOON] 11945 뜨거운 붕어빵  (0) 2024.01.09
[BAEKJOON] 27323 직사각형  (0) 2024.01.08
[BAEKJOON] 7785 회사에 있는 사람  (0) 2024.01.06
[BAEKJOON] 10867 중복 빼고 정렬하기  (0) 2024.01.05