본문 바로가기

SW개발/코딩테스트

[프로그래머스] 뒤에 있는 큰 수 찾기

문제 설명

정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.


제한사항
  • 4 ≤ numbers의 길이 ≤ 1,000,000
    • 1 ≤ numbers[i] ≤ 1,000,000

아이디어

1. numbers를 돌면서 큰 수를 못찾은 자리수에 해당 값을 넣어준다.

2. 큰 수를 못찾은 자리는 Stack을 이용한다.

 

처음에는 이중포문으로 그냥 돌렸는데 20~23번에서 시간초과가 떴다.

잘 못본 유형이라 이런 풀이는 생각지 못했는데 비슷한걸 풀어봐야 할 듯 하다.

#include <string>
#include <vector>
#include <stack>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
	stack<pair<int,int>> s;
	answer = vector<int>(numbers.size(), -1);
	for (size_t i = 0; i < numbers.size(); i++)
	{
		int value = numbers[i];
		while (!s.empty() && s.top().first < value)
		{
			auto t = s.top();
			s.pop();
			answer[t.second] = value;
		}
		s.push(make_pair(value, i));
	}
    return answer;
}