코딩테스트
[백준] 1406번: 에디터
시제이
2024. 5. 31. 19:26
728x90
반응형
간단한 구현 문제이다.
처음 생각했던 접근방식
처음에는 커서가 해당 문자의 왼쪽, 오른쪽에 있는 모든 경우를 나타내기 위해서 각 문자 사이에 빈공간을 넣는 방법을 생각했다.
그러나 커서를 움직일 때 반드시 두칸씩 움직여야하고 문자를 지우거나 넣을 때, 또는 모든 문자를 출력할 때,
필요 이상의 조건을 추가해야하므로 이는 문제에서 원하는 풀이 방식이 아닌 것 같았다.
이 때, 결국 커서의 움직임에 따라서 문자는 왼쪽 문자와 오른쪽 문자로 나뉘기 때문에 굳이 하나의 배열만 사용할 필요가 없다.
합당한 접근방식
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
|
#include <iostream>
#include <deque>
using namespace std;
int main() {
string str;
cin >> str;
int numCommands;
cin >> numCommands;
deque<char> leftString;
deque<char> rightString;
for(int i=0; i<str.size(); i++){
leftString.push_back(str[i]);
}
for(int i=0; i<numCommands; i++){
char command;
cin >> command;
if(command =='L' && !leftString.empty()){
char add = leftString.back();
leftString.pop_back();
rightString.push_front(add);
}else if(command == 'D' && !rightString.empty()){
char add = rightString.front();
rightString.pop_front();
leftString.push_back(add);
}else if(command == 'B' && !leftString.empty()){
char remove = leftString.back();
leftString.pop_back();
}else if(command == 'P'){
char word;
cin >> word;
leftString.push_back(word);
}
}
for(int i=0; i<leftString.size(); i++){
cout << leftString[i];
}
for(int i=0; i<rightString.size(); i++){
cout << rightString[i];
}
return 0;
}
|
cs |
따라서 왼쪽과 오른쪽 두개의 배열을 사용해서 커서가 왼쪽으로 가면 왼쪽 벡터에 있는 값을 지우고 오른쪽 벡터에 넣으면 된다.
반대로 커서가 오른쪽으로 가면 오른쪽 벡터에 있는 값을 지우고 왼쪽 벡터에 넣는다.
대신, 왼쪽은 값이 추가되거나 삭제될 때 맨 뒤에서 이루어지고, 오른쪽은 맨 앞에서 이루어지기 때문에 deque을 사용하였다.
deque을 사용하지 않고 스택을 이용한 풀이도 있다.
https://velog.io/@jmink002/C1406
[C++] 백준 1406번 풀이 (에디터)
백준 1406번 ( 에디터 )
velog.io
반응형