입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입력했다면, '-'가 주어진다. 이때 커서의 바로 앞에 글자가 존재한다면, 그 글자를 지운다. 화살표의 입력은 '<'와 '>'로 주어진다. 이때는 커서의 위치를 움직일 수 있다면, 왼쪽 또는 오른쪽으로 1만큼 움직인다. 나머지 문자는 비밀번호의 일부이다. 물론, 나중에 백스페이스를 통해서 지울 수는 있다. 만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다.
출력
각 테스트 케이스에 대해서, 강산이의 비밀번호를 출력한다. 비밀번호의 길이는 항상 0보다 크다.
string 값으로 입력값을 받아오고 vector< string >에 저장을 미리 다 하고,
나중에 벡터 각각의 string 값에 대해서 char원소 하나씩 가져와서 어떤 문자인지 분석했다.
vector[index]값의 문자열을 한 글자 씩 분석해서 커서를 옮겨가며 해당 문자열의 답을 알아내는 solvePassword(int index)함수를 구현하였다.
커서가 맨앞일땐 <,-가 작동을 안하게 만들고, 맨 뒤일땐 >가 작동을 안하게 해야한다.
#include<iostream>
#include<list>
#include<vector>
using namespace std;
int N;
//각 문자열에서 비밀번호를 출력하는 list
list<char> passWord;
//입력값 받는 문자열
vector<string> testCases;
//비밀번호 출력 list인 passWord에서 사용되는 커서
list<char>::iterator passWordCursor;
void input() {
string abc;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> abc;
testCases.push_back(abc);
}
//커서 초기화
passWordCursor = passWord.end();
}
/// <summary>
/// index번째의 입력 문자열의 각 char형 원소를 분석해 passWordCursor을 움직이며 passWord 리스트에 적고 지우고 하기
/// </summary>
/// <param name="index"></param>
void solvePassword(int index) {
//password 리스트 초기화
passWord.clear();
passWordCursor = passWord.end();
for (int i = 0; i < testCases[index].length(); i++) {
//다음이 -면 커서 전값 지우기
if (testCases[index][i] == '-') {
//사이즈 없다면
if (passWord.size() == 0) {
continue;
}
//커서가 첫 값이라면 전값 없으므로
if (passWordCursor == passWord.begin()) {
//패스
continue;
}
passWordCursor=passWord.erase(--passWordCursor);
}
//다음 <일 때
else if (testCases[index][i] == '<') {
//사이즈 없다면
if (passWord.size() == 0) {
continue;
}
//커서 하나 옆이 첫 값이라면
if (passWordCursor == passWord.begin()) {
//패스
continue;
}
passWordCursor--;
}
//다음 >일 때
else if (testCases[index][i] == '>') {
//사이즈 없다면
if (passWord.size() == 0) {
continue;
}
//커서 하나 옆이 첫 값이라면
if (passWordCursor == passWord.end()) {
//패스
continue;
}
passWordCursor++;
}
//그냥 문자 입력시
else {
//passWord에 넣어주기
passWord.insert(passWordCursor,testCases[index][i]);
}
}
//출력하기
for (auto iter = passWord.begin(); iter != passWord.end(); ++iter) {
cout << *iter;
}
}
void solution() {
for (int i = 0; i < N; i++) {
solvePassword(i);
cout << '\n';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
solution();
}
백준 1406번: 에디터 문제와 비슷하다. STL라이브러리의 list를 안다면 무난하게 풀 수 있는 문제다.