본문 바로가기
Coding Test/Problems

[BOJ] 17298번: 오큰수

by haerr 2024. 8. 20.

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

 

 

문제

크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.

예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.

 

풀이

샤라웃투@

N = int(input())
A = list(map(int, input().split()))
stack = [A[-1]]
ans = [-1]

for i in range(N - 2, -1, -1):
    while stack:
        if A[i] < stack[-1]:
            ans.append(stack[-1])
            break
        else: stack.pop()
    else:
        ans.append(-1)
    stack.append(A[i])

print(' '.join(map(str, ans[::-1])))

1. N과 A를 입력받는다.

2. A의 마지막 요소를 가지는 스택과 -1을 가지는 정답 리스트를 생성한다.

3. 뒤에서 두번째 수부터 0까지 for문으로 반복한다.

4. stack이 비어있지 않을 때, 만약 A[i]보다 스택의 가장 끝 값이 크다면, "오큰수"에 부합하므로 정답 리스트인 ans에 해당 값을 추가한다. 만약 그렇지 않다면 stack을 pop하고 다시 비교한다.

5. 만약 오큰수에 부합하는 수가 없으며 스택이 비어있다면 -1을 ans에 추가한다.

6. 현재 수 A[i]를 ans에 추가한다.

7. ans 배열을 뒤에서부터 출력한다.

 

for문의 i에 대응하는 A[i]를 현재 수라고 하면, stack에는 A[i+1]보다 큰 수와 A[i+1]만이 남아있게 되므로 오큰수를 적절히 찾을 수 있게 된다.

'Coding Test > Problems' 카테고리의 다른 글

[BOJ] 1012번: 유기농 배추  (2) 2024.08.21
[BOJ] 2606번: 바이러스  (0) 2024.08.21
[BOJ] 1417번: 국회의원 선거  (0) 2024.08.20
[BOJ] 1021번: 회전하는 큐  (0) 2024.08.20
[BOJ] 1158번: 요세푸스 문제  (2) 2024.08.20