반응형
https://www.acmicpc.net/problem/1406
본 문제는 2004 Olympiad Croatian Highschool Competitions in Informatics National Competition #1 - Juniors 2번 문제다. 이 문제는 코드 플러스 알고리즘 기초 1/2 - 자료구조 1에 있는 문제다. (처음 이 문제를 접했을 때, C++ STL이 익숙하지 않아 못 풀었다. 내가 기초가 많이 부족하다고 느꼈던 여러 문제들 중 하나다.) 보통 list 또는 linked list로 접근할 것이다. 하지만 stack으로 문제를 해결 할 수 있다. (??? : 많은 사람들이 어떻게 stack으로 풀 생각을 했냐고 물어보는데 나도 stack으로 풀 생각을 못했다. 답을 찾아보고 알았다. - 2020. 01. 백준 오프라인 강의 중)
- 커서를 기준으로 왼쪽 stack, 오른쪽 stack을 선언한다.
- 문제 조건을 만족하면서, P일 경우 왼쪽 stack에 push
- L일 경우, 왼쪽 stack top을 오른쪽 stack으로 push
- R일 경우, 오른쪽 stack top을 왼쪽 stack으로 push
- D일 경우, 왼쪽 stack top을 pop
- 출력할 땐, 왼쪽 stack 전체를 오른쪽으로 push
- 오른쪽 stack 전체를 pop하면서 출력
stack 소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string s = "";
cin >> s;
stack<char> l;
stack<char> r;
for (int i = 0; i < s.size(); i++) {
l.push(s[i]);
}
int num;
cin >> num;
while (num--) {
char tmp;
cin >> tmp;
if (tmp == 'P') {
char c;
cin >> c;
l.push(c);
}
else if (tmp == 'L') {
if (l.empty()) continue;
else {
r.push(l.top());
l.pop();
}
}
else if (tmp == 'B') {
if (l.empty()) continue;
else l.pop();
}
else if (tmp == 'D') {
if (r.empty()) continue;
else {
l.push(r.top());
r.pop();
}
}
}
while (!l.empty()) {
r.push(l.top());
l.pop();
}
while (!r.empty()) {
cout << r.top();
r.pop();
}
return 0;
}
|
cs |
list 소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main(){
int n;
string s;
cin >> s;
cin >> n;
list<char> l(s.begin(),s.end());
auto now = l.end();
while(n--){
char tmp;
cin >> tmp;
if(tmp == 'L'){
if(now != l.begin()){
now--;
}
}
else if(tmp == 'D'){
if(now != l.end()){
now++;
}
}
else if(tmp == 'B'){
if(now != l.begin()){
now = l.erase(--now);
}
}
else if(tmp == 'P'){
char c;
cin >> c;
l.insert(now, c);
}
}
for (auto it = l.begin(); it != l.end(); it++) {
cout << *it;
}
return 0;
}
|
cs |
반응형
'백준' 카테고리의 다른 글
[백준 4375] 1, C++ (0) | 2020.01.08 |
---|---|
[백준 1158] 요세푸스 문제, C++ (0) | 2020.01.08 |
[백준 1874] 스택 수열, C++ (0) | 2020.01.08 |
[백준 9012] 괄호, C++ (0) | 2020.01.08 |
[백준 9093] 단어 뒤집기, C++ (0) | 2020.01.08 |
댓글