
문제 설명
문제
아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 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
💻내가 짠 코드
import sys
N= int(input())
H= []
C=0
for _ in range(N):
h= int(input())
H.append(h)
for i in range(N):
if((H[-1])< H[i]):
C+=1
print(C)
단순히 마지막 막대기보다 더 큰 막대기의 개수를 구하려고 생각해서 잘못된 결과가 나왔다..
문제를 더 똑바로 읽기!!
import sys
N=int(sys.stdin.readline())
H=[int(sys.stdin.readline()) for _ in range(N)]
count=0
max_h=0
for i in range(N-1, -1, -1):
if((max_h)<H[i]):
count+=1
max_h=H[i]
print(count)
✍ 접근 방법
- 오른쪽에서 왼쪽으로 순회
- 막대기의 높이를 담은 리스트 H를 오른쪽에서 왼쪽 방향(역순)으로 탐색
- H[i](현재 막대기)가 지금까지 본 막대기 중 가장 높다면 보인다
→ 즉, 현재 막대기가 max_h보다 크면 보임 - 새로운 가장 높은 막대기가 나오면 max_h를 갱신
- 시간 복잡도 분석
- 리스트 한 번 순회(O(N))만 하면 해결 가능
- N이 최대 100,000이므로 O(N) 알고리즘 사용 가능
- 최적화된 접근 방식
'Study > Python' 카테고리의 다른 글
[99클럽 코테 스터디] 14일차 TIL - 식당 메뉴 (0) | 2025.02.06 |
---|---|
[99클럽 코테 스터디] 13일차 TIL - 큐 (0) | 2025.02.06 |
[99클럽 코테 스터디] 11일차 TIL - 스택 (0) | 2025.02.03 |
[99클럽 코테 스터디] 10일차 TIL - 회상 (0) | 2025.01.25 |
[99클럽 코테 스터디] 9일차 TIL - 전주 듣고 노래 맞히기 (0) | 2025.01.24 |