BOJ 17298 - 오큰수

9305 단어 bojboj
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초512 MB103643533260034.801%

문제


크기가 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)을 공백으로 구분해 출력한다.

접근


N의 최댓값이 100만이기에 당연히 브루트 포스로 풀 수 없다.
오른쪽에 제일 가까운 큰 수를 알 수 있는 방법이 무엇이 있을까?
바로 스택을 사용하면 된다.

풀이


배열을 뒤에서부터 순회했다.
스택이 비거나 더 큰수가 top에 있을때까지 pop을 해주었다.
이러면 제일 가까운 큰 수가 top에 남아있다.
물론, 비어있을때는 없는것이므로 -1을 넣어줘야된다.

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define FUP(i, a, b) for(int i = a; i <= b; i++)
#define FDOWN(i, a, b) for(int i = a; i >= b; i--)
#define MS(a, b) memset(a, b, sizeof(a))
#define ALL(v) v.begin(), v.end()
#define CIN(a) cin >> a;
#define CIN2(a, b) cin >> a >> b
#define CIN3(a, b, c) cin >> a >> b >> c
#define COUT(a) cout << a
#define COUT2(a, b) cout << a << ' ' << b
#define COUT3(a, b, c) cout << a << ' ' << b << ' ' << c
#define ENDL cout << '\n'
int dy[4] = { -1, 1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };

int N, arr[1000001], ans[1000001];
stack<int> S;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	CIN(N);
	FUP(i, 1, N) CIN(arr[i]);
	FDOWN(i, N, 1)
	{
		while (!S.empty() && S.top() <= arr[i])
		{
			S.pop();
		}
		ans[i] = S.empty() ? -1 : S.top();
		S.push(arr[i]);
	}
	FUP(i, 1, N) COUT2(ans[i], "");

	return 0;
}

좋은 웹페이지 즐겨찾기