BOJ 17298. ์คํฐ์
๐โโ๏ธ[Gold IV] ์คํฐ์ - 17298
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 12504 KB, ์๊ฐ: 212 ms
๋ถ๋ฅ
์๋ฃ ๊ตฌ์กฐ, ์คํ
์ ์ถ ์ผ์
2024๋ 1์ 17์ผ 12:26:56
๋ฌธ์ ์ค๋ช
ํฌ๊ธฐ๊ฐ 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)์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค.
๐ํ์ด
์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ฉํ ๋ฌธ์ .
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
int n;
vector<int> seq;
vector<int> NGE;
stack<int> s;
void setting()
{
// ์์ด ์ฑ์์ฃผ๊ธฐ
cin >> n;
seq = vector<int>(n + 1);
NGE = vector<int>(n + 1);
for (int i = 1; i <= n; ++i)
{
cin >> seq[i];
}
}
// ๋ฌธ์ ํด๊ฒฐ ๋ก์ง
void solve()
{
for (int i = n; i >= 1; --i)
{
while (s.empty() == false && s.top() <= seq[i])
s.pop();
if (s.empty())
NGE[i] = -1;
else
NGE[i] = s.top();
s.push(seq[i]);
}
for (int i = 1; i <= n; ++i)
{
cout << NGE[i] << " ";
}
}
์ ๋ ฅ ๊ฐ์ด ์๋์ ๊ฐ์ ๋ ์คํ์ ๋ณํ๋ฅผ ์์๋ณด์.
4
9 5 4 8
์คํ๊ณผ NGE์ ๋ณํ ์ถ์ .
seq[i] == 8 ์ธ ๊ฒฝ์ฐ
ํ์ฌ ์คํ ์ํฉ
stack
NULL
์คํ์ด ๋น์์ผ๋ฏ๋ก NGE[i]์ -1 ์ฝ์
.
NGE
0 0 0 -1
8์ stack์ push
stack
8
seq[i] == 4 ์ธ ๊ฒฝ์ฐ
ํ์ฌ ์คํ ์ํฉ
stack
8
stack์์ pop๋๋ ๊ฐ์ด ์๊ณ NULL์ด ์๋๋ฏ๋ก NGE[i]์ 8 ์ฝ์
.
NGE
0 0 8 -1
4๋ฅผ stack์ push
stack
4 8
seq[i] == 5 ์ธ ๊ฒฝ์ฐ
ํ์ฌ ์คํ ์ํฉ
stack
4 8
4๊ฐ 5๋ณด๋ค ์์ผ๋ฏ๋ก pop
stack
8
stack์ด NULL์ด ์๋๋ฏ๋ก NGE[i]์ 8 ์ฝ์
.
NGE
0 8 8 -1
5๋ฅผ stack์ push
stack
5 8
seq[i] == 9 ์ธ ๊ฒฝ์ฐ
ํ์ฌ ์คํ ์ํฉ
stack
5 8
5๊ฐ 9๋ณด๋ค ์์ผ๋ฏ๋ก pop.
stack
8
8์ด 9๋ณด๋ค ์์ผ๋ฏ๋ก pop.
stack
NULL
์คํ์ด ๋น์์ผ๋ฏ๋ก NGE[i]์ -1 ์ฝ์
.
NGE
-1 8 8 -1
9๋ฅผ stack์ push
stack
9
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int n;
vector<int> seq;
vector<int> NGE;
stack<int> s;
void setting()
{
cin >> n;
seq = vector<int>(n + 1);
NGE = vector<int>(n + 1);
for (int i = 1; i <= n; ++i)
{
cin >> seq[i];
}
}
void solve()
{
for (int i = n; i >= 1; --i)
{
while (s.empty() == false && s.top() <= seq[i])
{
s.pop();
}
if (s.empty())
NGE[i] = -1;
else
NGE[i] = s.top();
s.push(seq[i]);
}
for (int i = 1; i <= n; ++i)
{
cout << NGE[i] << " ";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}