티스토리 뷰

PS/BOJ Python

17299번 - 오등큰수

zpqmdh 2023. 10. 25. 11:34

https://www.acmicpc.net/problem/17299

 

17299번: 오등큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

오큰수 문제와 비슷하다. 그런데... "시간초과" 이게 날 괴롭혔다.

애초에 문제를 잘못읽은 부분이 있었다. 

빈도만 따지면 되는데 수까지 커야 한다고 생각한 것이다.  따라서 조건을 아래와 같이 두 개로 선정하였다.

A[i] <= stack[-1] and F[A[i]-1]>=F[stack[-1]-1]

그리고 리스트의 count 연산은 시간을 많이 소모한다.  따라서... 아래처럼 count를 쓰기 보다는 for 반복문으로 직접 세는게 더 낫다. 그리고 생각해보건데, A에 포함되지 않은 수까지 count 연산을 진행하는 것도 영향이 있을 것 같다. 1번의 경우, 0부터 A의 최댓값까지 모두 A에 접근하여 count 연산을 진행하기 때문이다.

# 1: count 사용
F = [A.count(i+1) for i in range(max(A))]

# 2: 반복문 사용
F = [0 for i in range(max(A)+1)]
for i in range(N):
    F[A[i]] += 1

 

제출한 최종 코드는 아래와 같다.

# 오등큰수
import sys
input = sys.stdin.readline

N = int(input())
A = list(map(int, input().split()))
F = [0 for i in range(max(A)+1)]
for i in range(N):
    F[A[i]] += 1
stack = []
result = ['' for _ in range(N)]
for i in range(N-1, -1, -1): 
    while stack and F[A[i]]>=F[stack[-1]]:
        stack.pop()
    if stack:
        result[i] = str(stack[-1])
    else:
        result[i] = '-1'
    stack.append(A[i])
    
print(' '.join(result))

'PS > BOJ Python' 카테고리의 다른 글

11051번 - 이항 계수 2  (2) 2023.10.31
3273번 - 두 수의 합  (1) 2023.10.25
1120번 - 문자열  (0) 2023.10.12
10971번 - 외판원 순회 2  (1) 2023.10.11
10819번 - 차이를 최대로  (2) 2023.10.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함