본문 바로가기
📊알고리즘/BOJ

BOJ 17298] 오큰수

by meteorfish 2022. 12. 15.
728x90

[ 접근법 ]

- 오른쪽 수열에서 자신보다 큰 수중 가장 작은 값을 구하는 것이기 때문에 stack을 이용하자.

- 하나하나 비교하는 o(n*n)는 수가 100000에 달하기 때문에 다른 방법을 모색해야 된다.

- 왼쪽에 있는 수열의 오큰수는 무조건 오른쪽의 있는 수열보다 작거나 같다.

- 그렇기 때문에 만약 다음 수열이 자신의 오큰수가 아니라면 stack에 저장해두고 다음 수열의 오큰수가 등장하면,

그때 stack을 pop하면서 해당 오큰수가 stack에 저장된 오큰수가 맞나 확인을 한다.

- 만약 오큰수가 아니라면 -1을 저장한다.

 

[ 주의사항 ]

- 결과 저장배열에 수열 순서대로 저장해야 순서가 뒤죽박죽 되지 않는다.

- 시간이 1초라고 해서 이중반복문이 등장하면 안되는 것이 아니다!

- 마찬가지로 굳이 입력을 한번에 안받도 받는 즉시 하려고 하지 않아도 된다!

- 순서 저장할라고 큐를 도입했는데 그러지말고 배열을 이용해서 순서를 저장해라!

 

 

[ 코드 ]

더보기
#include <iostream>
#include <stack>
#include <queue>
#include <vector>

using namespace std;

/*
순서를 저장해야하면 배열을 이용해서 순서를 기록하자!
*/

stack<int> s;
int arr[1000001]; // 순서대로 수열을 저장
int res[1000001]; // 각 수열의 오큰수의 값을 저장

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

	int n, temp, num;
	cin >> n;
	num = n;
	

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}

	for (int i = 0; i < n; i++) {
		while (!s.empty() && arr[s.top()] < arr[i]) {
			res[s.top()] = arr[i];
			s.pop();
		}
		s.push(i);
	}

	while (!s.empty()) {
		res[s.top()] = -1;
		s.pop();
	}

	for (int i = 0; i < n; i++) {
		cout << res[i] << ' ';
	}
	
	 
	 return 0;
}

 

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 9935] 문자열 폭발  (0) 2022.12.19
BOJ 2504] 괄호의 값  (0) 2022.12.19
BOJ 17299] 오등큰수  (0) 2022.12.15
BOJ 1874] 스택 수열  (0) 2022.12.13
BOJ 6198] 옥상 정원 꾸미기  (0) 2022.12.13