๊ณจ๋4 : stack ๋ฌธ์ ์ด๋ค.
ํ์ด
์, ์ ๋ง ์์ฌ์ด ๋ฌธ์ ์๋ค. ํ์ง๋ง ๋ฐฐ์ด ๊ฒ์ด ์์๋ค. Stack์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ์ ์ด๋ค ๋ณต์ก๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํจ์ด๋ค. ์ด ๋ถ๋ถ์ ๋ค์ ๋ค์ ์ดํด๋ณด๋๋ก ํ์. ์ผ๋จ ์ด ๋ฌธ์ ๋ฅผ ๋จ์ํ๊ฒ ์ํํด์ ํผ๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ ๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ n=1,000,000์ธ ์ํฉ์์ ๋ฐ๋ก ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ๊ทธ๋์ ์ด๋ฅผ n์ ๊ฐ๊น์ด ์๋๋ก ํ์ด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ๋ถ์ํด๋ณด์. ์คํฐ์๋ ํ์ฌ ๊ฐ์์ ์ค๋ฅธ์ชฝ์ ์๋ ํฐ๊ฐ๋ค ์ค ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ๋์ค๋ ๋ ์์ด๋ผ๊ณ ์ j์ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ํ์ฌ๊ฐ์ด 4์ธ๋ฐ, ๋ค์ ๊ฐ์ด 10์ด๋ฉด ๊ทธ 10์ด ์คํฐ์๊ฐ ๋ ์ ์๊ฒ ๋ค. ์ฌ๊ธฐ์ ์ ์ ์๋ ์ ์ ์, ํฐ๋์ด ๋์ค๋ฉด ๊ทธ ์ ๊ฐ์ ์ด ํฐ๋์ด ์คํฐ์๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ตฌ๋. ์ ๋์ด๋ค. ๊ทธ๋ผ ์ด๋ฐ ์ํฉ์ ์ด๋จ๋ผ?
4 3 9
์ด๋ฐ ์ํฉ์์ 4์ ์ ์ฅ์์ 3์ ์คํฐ์๊ฐ ์๋๋ค. ํ์ง๋ง 3์ ์ ์ฅ์์ 9๋ ์คํฐ์์ด๋ค. ๊ทธ๋ ๋ค๋ฉด 4์ ์คํฐ์๋? 9์ด๋ค. ์ฌ๊ธฐ์, ํ์ฌ ๊ฐ๋ณด๋ค ๋ฏธ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ๊ณผ๊ฑฐ๊ฐ๋ค ์ค์ ๋ฏธ๋ ๊ฐ์ ์คํฐ์๋ก ๊ฐ์ง๋ ๋ ์์ด ์์ ์ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๋ค.
1 7 9 7 8 3 1 4 10 3 10
7 9 10 8 10 4 4 10 -1 10 -1
์ ๊ทธ๋ผ, ์ด๋ค ๋ถ๊ธฐ์์ ์ด ๊ฐ์ ์ด ํ๋ฆด ์ ์์๊น? ์ผ๋จ ๋ฏธ๋ ๊ฐ์ด ํ์ฌ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด, ํ์ฌ ๊ฐ์ ์คํฐ์๋ ๊ทธ ๋ฏธ๋๊ฐ์ด ์๋๋ค. ์ฌ๊ธฐ์ stack์ ์ฌ์ฉํด๋ณด์. stack์๋ ๋ค์์ ๋์ฌ ๋ฏธ๋๊ฐ์ ์ํด ์คํฐ์๊ฐ ๊ฒฐ์ ๋ ํ๋ณด ์์น๋ฅผ ๋งํ๋ค. ์ข ์ด๋ ค์ฐ๋ ์ ์ด๋ณด์.
11
1 7 9 7 8 3 1 4 10 3 10
index : 0
value : 1
stack ํ์ฌ ์ํ
0
index : 1
value : 7
stack top (position): 0
value : 1
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
0
answer before
0 0 0 0 0 0 0 0 0 0 0
stack after
answer after
7 0 0 0 0 0 0 0 0 0 0
stack ํ์ฌ ์ํ
1
index : 2
value : 9
stack top (position): 1
value : 7
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
1
answer before
7 0 0 0 0 0 0 0 0 0 0
stack after
answer after
7 9 0 0 0 0 0 0 0 0 0
stack ํ์ฌ ์ํ
2
index : 3
value : 7
stack top (position): 2
value : 9
stack ํ์ฌ ์ํ
2 3
index : 4
value : 8
stack top (position): 3
value : 7
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2 3
answer before
7 9 0 0 0 0 0 0 0 0 0
stack after
2
answer after
7 9 0 8 0 0 0 0 0 0 0
stack ํ์ฌ ์ํ
2 4
index : 5
value : 3
stack top (position): 4
value : 8
stack ํ์ฌ ์ํ
2 4 5
index : 6
value : 1
stack top (position): 5
value : 3
stack ํ์ฌ ์ํ
2 4 5 6
index : 7
value : 4
stack top (position): 6
value : 1
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2 4 5 6
answer before
7 9 0 8 0 0 0 0 0 0 0
stack after
2 4 5
answer after
7 9 0 8 0 0 4 0 0 0 0
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2 4 5
answer before
7 9 0 8 0 0 4 0 0 0 0
stack after
2 4
answer after
7 9 0 8 0 4 4 0 0 0 0
stack ํ์ฌ ์ํ
2 4 7
index : 8
value : 10
stack top (position): 7
value : 4
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2 4 7
answer before
7 9 0 8 0 4 4 0 0 0 0
stack after
2 4
answer after
7 9 0 8 0 4 4 10 0 0 0
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2 4
answer before
7 9 0 8 0 4 4 10 0 0 0
stack after
2
answer after
7 9 0 8 10 4 4 10 0 0 0
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
2
answer before
7 9 0 8 10 4 4 10 0 0 0
stack after
answer after
7 9 10 8 10 4 4 10 0 0 0
stack ํ์ฌ ์ํ
8
index : 9
value : 3
stack top (position): 8
value : 10
stack ํ์ฌ ์ํ
8 9
index : 10
value : 10
stack top (position): 9
value : 3
์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ
stack before
8 9
answer before
7 9 10 8 10 4 4 10 0 0 0
stack after
8
answer after
7 9 10 8 10 4 4 10 0 10 0
stack ํ์ฌ ์ํ
8 10
7 9 10 8 10 4 4 10 -1 10 -1
์์๋๋ก ๋ฐ๋ผ๊ฐ๋ค ๋ณด๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค. ์ต์ข ์ ์ผ๋ก stack์ ๋จ๋ ๊ฐ์, ๋งจ ๋ง์ง๋ง ๊ฐ๊น์ง ๋ณด์๋๋๋ ์คํฐ์๋ฅผ ์ฐพ์ ์ ์์๋, ์ธ๋ฑ์ค ๋ค์ด๋ค. ์คํฐ์๋ฅผ ์ฐพ์ง ๋ชปํ ๋ ์๋ค์ ๋ง์ง๋ง์ผ๋ก -1๋ก ์ ๋ฐ์ดํธํ๋ฉด ๋๋๋ค.
Code
//
// main.cpp
// algorithm_prac
//
// Created by ์ต์์ on 2021/04/05.
//
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// stack์ ์์น ์ ๋ณด๋ฅผ ๋ฃ์ผ๋ฉด ์ค๋ณต ์ฐ์ฐ์ ์ค์ผ ์ ์๋ค..!!!!
int N;
int a[1000001] = {0,};
int v[1000001] = {0,};
vector<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 >> a[i];
}
for (int i = 0; i < N; i++) {
cout << "index : " << i << '\n';
cout << "value : " << a[i] << '\n';
if (!s.empty()) {
cout << "stack top (position): " << s.back() << '\n';
cout << "value : " << a[s.back()] << '\n';
}
while (!s.empty() && a[s.back()] < a[i]) {
cout << " ์คํฐ์ ํ๋ณด ๋ฐ๊ฒฌ, ๋ต์ ์
๋ฐ์ดํธ" << '\n';
cout << " stack before" << '\n' << " ";
for (int j = 0; j < s.size(); j++) {
cout << s[j] << " ";
}cout << '\n';
cout << " answer before" << '\n' << " ";
for (int j = 0; j < N; j++) {
cout << v[j] << " ";
}cout << '\n';
v[s.back()] = a[i];
s.pop_back();
cout << " stack after" << '\n' << " ";
for (int j = 0; j < s.size(); j++) {
cout << s[j] << " ";
}cout << '\n';
cout << " answer after" << '\n' << " ";
for (int j = 0; j < N; j++) {
cout << v[j] << " ";
}cout << '\n';
}
s.push_back(i);
cout << "stack ํ์ฌ ์ํ" << '\n';
for (int j = 0; j < s.size(); j++) {
cout << s[j] << " ";
}cout << '\n' << '\n';
}
while (!s.empty()) {
v[s.back()] = -1;
s.pop_back();
}
for (int i = 0; i < N; i++) {
cout << v[i] << " ";
}
return 0;
}