어떻게 풀까? (문제를 보고 처음 든 생각)
연결 리스트로 풀면 될 것 같다. STL list를 활용하자.
※ STL list 사용법: https://losskatsu.github.io/programming/c-stl-list/#2-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%82%AC%EC%9A%A9%EC%98%88
string 배열에 문자열을 입력을 받고
'<'일 때는 iter를 하나 빼고(a.begin()이 아닐 때)
'>'일 때는 iter를 하나 추가하고(a.end()가 아닐 때)
'-'일 때는 erase를 사용하면 될 것 같다.(a.begin()이 아닐 때
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n; // 숫자 입력
while (n--) {
string x;
cin >> x; // 문자열 입력
list<char> a; // 리스트
list<char>::iterator iter = a.begin();
for (int i = 0; i < x.length(); i++) {
if (x[i] == '<') { // 왼쪽 방향키
if (iter != a.begin() && !(a.empty())) {
iter--;
}
}
else if (x[i] == '>') { // 오른쪽 방향키
if (iter != a.end() && !(a.empty())) {
iter++;
}
}
else if (x[i] == '-') { // 백스페이스 키
if (iter != a.begin()) {
iter--; // 이거 안넣었더니 오류가..
iter = a.erase(iter);
}
}
else { // 문자열 입력
a.insert(iter, x[i]);
}
}
for (auto it : a) { // 출력
cout << it;
}
cout << '\n';
}
}
백스페이스 키에서 iter--;를 넣는 것을 빼먹었더니 계속 오류가 났다.
백스페이스 키를 눌렀을 때는 이전 노드로 iter를 옮겨준 다음 erase를 써야 지워진다.
그냥 iter = a.erase(iter);를 써버리면 현재 노드에는 아무런 값도 써져있지 않으므로 오류가 난다.
(참고로 처음에는 그냥 a.erase(iter);를 써서 이 부분에도 오류가 발생했다..)
결과
출력 초과와 런테임 에러가 발생해서 많이 당황했었다. 위에서 언급한 iter--;와 iter = a.erase(iter); 부분을 찾는 것이 힘들었다.
후기
STL list의 활용법을 익힐 수 있어서 좋았다. iterator 활용에 더 익숙해져야겠다는 생각이 든다.
'Baekjoon(C++)' 카테고리의 다른 글
[백준] 2164번: 카드2 C++로 풀어보기 (0) | 2023.07.22 |
---|---|
[백준] 1874번: 스택 수열 C++로 풀어보기 (0) | 2023.07.17 |
[백준] 1919번: 애너그램 만들기 C++로 풀어보기 (0) | 2023.07.15 |
[백준] 2609번: 최대공약수와 최소공배수 C++로 풀어보기 (0) | 2023.07.13 |
[백준] 27866번: 문자와 문자열 C++로 풀어보기 (0) | 2023.07.13 |