본문 바로가기

코딩테스트 문제풀이

백준 17298 번 오큰수

728x90

문제

크기가 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이다.

입력

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

출력

총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.

출처 : 백준 17298번 오큰수

정답:

 

N=int(input(""))

numbers=list(map(int,input("").split()))

stack=[]
answer= [-1]*N

for i in range(N):
   
    while stack and numbers[stack[-1]]<numbers[i]:

        answer[stack.pop()]=numbers[i]
       
    stack.append(i)
   
print(*answer)

 

해당수열 오른쪽에 더 큰 수들의 값중 가장 왼쪽에 있는 값을 추출해내는 문제

 

1:stack []

2:stack[0]

3:stack[1]

4:stack[1,2]

 

즉 stack[-1]은 스택의 제일 마지막 값이고 numbers[i]는 list값 순서대로 출력

한것을 비교한다.만약 stack[-1]값보다 numbers[i]의 값이 더 크게나온다면

 

answer=[-1,-1,-1,-1] stack의 제일마지막값을 answer의 인덱스로 사용하고

그 인덱스값에 number[oi]를 넣어준다.

 

 

 

 

  • 따라서
    1. stack을 하나 만들고
    2. -1이 n개 있는 blueprint를 만든다
  • 그 후 for문을 한번 돌리면서
    1. stack에 무언가 존재하고 &&  arr[stack에 들어있는 마지막 값] 과 arr[i]를 비교했을 때 마지막 값보다 arr[i]가 더 크면 blueprint[stack에 들어있는 마지막 값]을 arr[i]로 바꾼다
    2. stack에 i를 append한다

 

문제는어렵지않았지만 풀이하는데 꽤 어려웠던것같다.

더 열심히 노력해야겠다 ...

728x90

'코딩테스트 문제풀이' 카테고리의 다른 글

14916 거스름돈  (0) 2022.10.17
17413 단어뒤집기 2 백준온라인  (0) 2022.10.17
백준 16953번 A->B  (1) 2022.10.13
백준 5397번 키로거  (0) 2022.10.10
백준 1715번 카드정렬하기  (0) 2022.10.09