본문 바로가기

개발/알고리즘

백준 17298 오큰수 C++ (Stack)

문제

www.acmicpc.net/problem/17298

 

17298번: 오큰수

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

www.acmicpc.net

코드1 (값을 이용하여 <- 방향으로 순회)

#include <bits/stdc++.h>

using namespace std;

int n, arr[1000001], ans[1000001];
stack<int> s;

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

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

	for (int i = n - 1; i >= 0; i--)
	{
		while (s.empty() == false && s.top() <= arr[i])
			s.pop();

		if (s.empty())
			ans[i] = -1;
		else
			ans[i] = s.top();

		s.push(arr[i]);
	}

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

 

코드2 (인덱스를 이용하여 <- 방향으로 순회)

#include <bits/stdc++.h>

using namespace std;

int n, arr[1000001], ans[1000001];
stack<int> s;

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

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

	for (int i = n - 1; i >= 0; i--)
	{
		while (s.empty() == false && s.top() <= arr[i])
			s.pop();

		if (s.empty())
			ans[i] = -1;
		else
			ans[i] = s.top();

		s.push(arr[i]);
	}

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

 

코드3 (인덱스를 이용하여 -> 방향으로 순회)

#include<bits/stdc++.h>

using namespace std;

int n, arr[1000004], ans[1000004];
stack<int> s;

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

	cin >> n;
	fill(ans, ans + 1000004, -1);
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
		while (s.size() && arr[s.top()] < arr[i])
		{
			ans[s.top()] = arr[i];
			s.pop();
		}

		s.push(i);
	}

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

'개발 > 알고리즘' 카테고리의 다른 글

백준 1094 막대기 C++  (0) 2021.05.05
백준 1987 알파벳 C++  (0) 2021.05.03
백준 17070 파이프옮기기1 C++  (0) 2021.04.18
백준 1647 도시 분할 계획 C++  (0) 2021.04.17
백준 1344 축구 C++  (0) 2021.04.16