문제 바로가기: https://www.acmicpc.net/problem/17299
# 시간 초과
import sys
input = sys.stdin.readline
a = int(input())
b = list(map(int,input().split()))
c = [-1] * a
stack = [0]
for i in range(1,a):
while stack and b.count(b[stack[-1]])<b.count(b[i]):
c[stack.pop()] = b[i]
stack.append(i)
print(*c)
혹시 stack과 while,pop이 이해가 안간다면 이전 게시물을 보고 오는 것을 추천한다
이전 게시물 바로가기: https://velog.io/@fltk1004/%EB%B0%B1%EC%A4%80-Python-17298%EB%B2%88-%EC%98%A4%ED%81%B0%EC%88%98
아마 시간초과난 이유는 파이썬에서 count 내장함수가 시간을 많이 잡아먹는 모양이다.
import sys
input = sys.stdin.readline
a = int(input())
b = list(map(int,input().split()))
c = [-1] * a
stack = [0]
cnt = [0] * 1000001
for i in b:
cnt[i] += 1
for i in range(1,a):
while stack and cnt[b[stack[-1]]]<cnt[b[i]]:
c[stack.pop()] = b[i]
stack.append(i)
print(*c)
count내장함수를 사용하지 않고 cnt배열을 만들어 해당 숫자마다 1씩 더해주었다.
a = 7
b = [1, 1, 2, 3, 4, 2, 1]
라면,
cnt = [0, 3, 2, 1, 1, ...] 가 된다
그래서 while문에서 b로 비교하지 않고 cnt로 비교해주면 된다
분명 비슷한 문제 풀었던 것 같은데...
반복풀이가 중요한 것 같다
앞으로 정수형 배열 갯수관련 문제 나오면 count함수 대신 해당 숫자 인덱스에 1씩 더해줘서 풀자
이제 절대 안까먹을 것 같다...