문제: https://www.acmicpc.net/problem/5397
#include <iostream>
#include <list>
#include <string>
using namespace std;
string input;
int n;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> input;
list<char> l;
list<char>::iterator t = l.end();
for (char c : input) {
switch (c) {
case '<':
if (t == l.begin()) continue;
t--;
break;
case '>':
if (t == l.end()) continue;
t++;
break;
case '-':
if (t == l.begin()) continue;
if (t == l.end()) {
l.erase(--t);
t = l.end();
} else
t = l.erase(--t);
break;
default:
l.insert(t, c);
}
}
for (char c : l) cout << c;
cout << '\n';
}
}
비밀번호에 대해 커서 이동과 임의의 위치에서 삭제 및 입력이 발생하기 때문에 연결리스트를 사용해서 풀었다.
비밀번호를 기억하기 위한 연결리스트 l를 선언하고, 커서를 나타내기 위해 변수 t에 l.end()를 할당한다.
이후엔 강산이의 키보드 입력을 input 변수에 담아서 한 글자씩 꺼내어 switch문으로 처리했다.
'<'인 경우 커서가 맨 왼쪽에 있다면 해당 케이스를 무시하고, 아니라면 t--를 한다.
'>'인 경우 커서가 맨 오른쪽에 있다면 해당 케이스를 무시하고, 아니라면 t++를 한다.
'-'인 경우 커서가 맨 왼쪽에 있다면 해당 케이스를 무시하고, 아니라면 l.erase()로 커서 앞 문자를 지운다.
이때 --t를 인자로 넘겨주는 이유는 에디터 문제와 똑같은 이유로 커서 앞의 문자를 지워야하기 때문이다.
t가 l.end()일 때를 따로 처리해주는 이유는 erase 메소드의 특징 때문이다.
역시 에디터와 같은 문제라서 똑같은 방법으로 처리했다.
이 외의 경우에는 연결리스트에 넣어주면 된다.
'알고리즘' 카테고리의 다른 글
[BOJ] 10828: 스택 (0) | 2022.09.28 |
---|---|
[BOJ] 1158: 요세푸스 문제 (0) | 2022.09.28 |
[BOJ] 1406: 에디터 (0) | 2022.09.28 |
[BOJ] 10808: 알파벳 개수 (0) | 2022.09.23 |
[BOJ] 3273: 두 수의 합 (0) | 2022.09.22 |