Notice
Recent Posts
Recent Comments
Link
나의 개발일지
[백준] 17299 오등큰수 [Python, 파이썬] 본문
- 문제 : https://www.acmicpc.net/problem/17299
- 🔑 스택, 입력받은 숫자 리스트 역순으로 순회
- 먼저 입력받은 숫자들의 개수를 센다.
- 리스트 순회하면서 count() 함수로 셀 수도 있지만
- collections 모듈의 Counter 클래스로 간단하게 셀 수 있다.
- 리스트의 값을 역순으로 스택에 넣는 이유
- 스택에 현재 들어온 숫자의 바로 밑에 있는 숫자가 현재 들어온 숫자의 개수보다 많은 것 중 가장 왼쪽의 값으로 만들기 위함
- 먼저 입력받은 숫자들의 개수를 센다.
from collections import Counter
n = int(input())
numbers = list(map(int, input().split()))
cnt = Counter(numbers) # 숫자의 개수 세기
stack = []
answer = [0] * n
for i in range(n-1, -1, -1): # 리스트 역순으로 순회
if not stack: # 스택 비어있으면
stack.append(numbers[i]) # 스택에 추가
answer[i] = -1 # 정답에 -1 추가
elif cnt[stack[-1]] > cnt[numbers[i]]: # 스택 맨 위 숫자의 개수가 현재 들어오는 숫자의 개수보다 많으면
answer[i] = stack[-1] # 정답에 스택 맨 위 숫자 추가
stack.append(numbers[i]) # 스택에 현재 숫자 추가
else:
while stack and cnt[stack[-1]] <= cnt[numbers[i]]: # 스택에 값이 있고,
# 스택 맨 위 숫자의 개수가 현재 들어오는 숫자의 개수보다 작거나 같으면
stack.pop() # 스택에서 뺀다
if not stack: # 다 빼고 스택이 비어있으면
answer[i] = -1 # 정답에 -1 추가
stack.append(numbers[i]) # 스택에 현재 숫자 추가
else: # 스택에 값이 남아있으면
answer[i] = stack[-1] # 정답에 스택 맨 위 숫자 추가
stack.append(numbers[i]) # 스택에 현재 숫자 추가
print(*answer)
'백준' 카테고리의 다른 글
[백준] 24337 가희와 탑 [Python, 파이썬] (1) | 2023.12.08 |
---|---|
[백준] 1436 영화감독 숌 [Python, 파이썬] (1) | 2023.12.03 |
[백준] 5549 행성 탐사 [Python, 파이썬] (0) | 2023.11.30 |
[백준] 15903 카드 합체 놀이 [Python, 파이썬] (1) | 2023.11.24 |
[백준] 28283 해킹 [Python, 파이썬] (0) | 2023.11.13 |
Comments