728x90
문제
https://www.acmicpc.net/problem/1406
문제이해
- 첫째 줄에 편집하고자 하는 문장이 주어진다. 영어 소문자로만 이루어져 있으며 길이는 100,000을 넘지 않는다.
- 둘째 줄에는 입력할 명령어의 개수(N)가 주어진다.
- 셋째 줄부터 N개 만큼의 명령어가 주어진다.
명령어의 종류는 다음과 같다.
L | 커서를 왼쪽으로 한 칸 옮긴다.(다만 커서가 문장 맨 앞일 경우 무시한다.)
D | 커서를 오른쪽으로 한 칸 옮긴다.(다만 커서가 문장 맨 뒤일 경우 무시한다.)
B | 커서의 왼쪽에 있는 문자를 삭제한다.(다만 커서가 문장 맨 앞일 경우 무시한다.)
P $ | $라는 문자를 커서 왼쪽에 추가한다. - 명령어를 실행한 후의 문장을 출력한다.
시간 제한이 0.3초이며 문장의 중간에 문자를 제거하거나 추가하는 경우가 있을 수 있기 때문에 vector를 사용하기보단 list를 사용하는게 적절하다. 커서는 iterator로 표현하기만 하면 된다. 다만 문제에서 커서는 문자와 문자 사이에 있기때문에 그 점만 조심해주면 된다.
문제해결
#include <iostream>
#include <string>
#include <list>
using namespace std;
list<char> text;
int main() {
string str, com;
char inp;
cin >> str;
int N;
cin >> N;
for (char c : str) {
text.push_back(c);
}
list<char>::iterator iter = text.end();
for (int i{ 1 }; i <= N; i++) {
list<char>::iterator test = text.begin();
cin >> com;
if (com == "L") {
if (iter != text.begin()) {
iter--;
}
}
else if (com == "D") {
if (iter != text.end()) {
iter++;
}
}
else if (com == "B") {
if (iter != text.begin()) {
iter--;
iter = text.erase(iter);
}
}
else if (com == "P") {
cin >> inp;
text.insert(iter, inp);
}
}
iter = text.begin();
for (iter; iter != text.end(); iter++) {
cout << *iter;
}
}
문장을 list<char> text에 한 글자씩 저장하고 list<char>::iterator iter로 커서를 구현하였다.
문제후기
list를 사용할 줄만 안다면 구현하는데 어려움이 있는 문제는 아니였다.
728x90
'Coding' 카테고리의 다른 글
[C++]백준 2075번: N번째 큰 수 (0) | 2023.07.13 |
---|---|
[C++]백준 1655번: 가운데를 말해요 (0) | 2023.07.13 |
[C++]백준 5430번: AC (0) | 2023.07.11 |
[C++]백준 2258번: 정육점 (0) | 2023.07.11 |
[C++]백준 18185번: 라면 사기 (Small) (0) | 2023.07.10 |