본문 바로가기

백준 풀이

백준 17298 - 오큰수 (Python)

깃허브:

https://github.com/MSIQOC/BOJ/blob/master/b17298_%EC%98%A4%ED%81%B0%EC%88%98.py

 

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

 

17298번: 오큰수

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

www.acmicpc.net

 

https://reakwon.tistory.com/196

 

[스택] BOJ17298 오큰수 문제 풀이 및 전체 코드(C++)

BOJ 17298 오큰수 https://www.acmicpc.net/problem/17298 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 ..

reakwon.tistory.com

 

위의 블로그를 참고해서 풀었다.

맨 오른쪽 숫자는 무조건 -1이기 때문에 오른쪽부터 왼쪽으로 가는 방식으로 접근한다.

i를 n-1부터 0까지 돌리고 스택의 top이 arr[i]보다 크면 그것이 그 숫자의 오등큰수가 된다. (작으면 스택에서 pop 시킨다.)


Python

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#
# Created by MinSeo on 2022/02/06.
# Copyright ⓒ 2021 MinSeo Shin. All rights reserved.
#
= int(input())
inp = list(map(int, input().split()))
stack = []
arr = [-1* n
stack.append(inp[-1]) #제일 오른쪽 값 추가
for i in range(n-2-1-1):
    while stack and stack[-1<= inp[i]:
        stack.pop()
    if stack:
        arr[i] = stack[-1]
    stack.append(inp[i])
 
for a in arr:
    print(a, end=' ')
cs

여기에서 주의해야할 점은 while stack and stack[-1] <= inp[i]를 while stack[-1] <= inp[i] and stack로 순서를 바꾸면 index out of range 에러가 난다. (stack이 있는지를 검사하기 전에 stack[-1]에 들어가는거랑 stack이 없단걸 확인하고 바로 while문을 벗어나는 차이인 것 같다.)

'백준 풀이' 카테고리의 다른 글

백준 7453 - 합이 0인 네 정수 (Python)  (0) 2022.02.13
백준 11657 - 합이 0인 네 정수 (Python)  (0) 2022.02.09
백준 11047 - 동전0  (0) 2021.03.28
백준 1149 - RGB거리  (0) 2021.03.28
백준 9461 - 파도반 수열  (0) 2021.03.28