오등큰수 구하기.
입력 | 출력 |
---|---|
7 1 1 2 3 4 2 1 | -1 -1 1 2 2 1 -1 |
: 각 원소의 등장횟수를 구하고 (등장횟수, 원소)를 새로운 배열에 저장한다. 새로운 배열에 대하여 오등큰수를 구해야 할 혹은 오등큰수를 구하지 못한 수를 스택에 (등장횟수, 원소, 인덱스)로 저장한다. 배열의 i번째 원소와 스택의 top원소를 비교하여 i번째 원소가 클 동안 pop하고 pop한 원소의 인덱스에 해당하는 배열을 i번째 원소로 업데이트한다.
시도1. count함수 사용 => 시간초과 발생.
시도2. 등장 횟수를 세어서 딕셔너리에 저장 => 성공
n = int(input())
arr = list(map(int, input().split()))
result = [-1]*len(arr)
d = {} # 등장 횟수를 기록할 딕셔너리
for a in arr:
if a in d:
d[a] += 1
else:
d[a] = 1
num = []
for a in arr:
num.append((d[a], a)) # (등장횟수, 원소)를 리스트에 저장
s = []
for i in range(len(num)):
while s and s[-1][0] < num[i][0]:
counti, ele, idx = s.pop()
result[idx] = num[i][1]
s.append((num[i][0], num[i][1], i))
print(*result)