[백준] Python 17299번 오등큰수

syeony·2024년 12월 7일
0

python

목록 보기
16/20


문제 바로가기: 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씩 더해줘서 풀자
이제 절대 안까먹을 것 같다...

profile
모바일 어플리케이션, cross platform과 iOS에 관심이 많은 개발자 오승연입니다

0개의 댓글