반응형

연결리스트의 개념을 잘 숙지했는지
판단하기 위한 기본 문제다
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main() {
string str;
cin >> str;
int n;
cin >> n;
list<char> l;
for(char c : str) l.push_back(c);
char cm;
list<char>::iterator cursor = l.end();
for(int tmp=0; tmp<n; tmp++)
{
cin >> cm;
if(cm == 'L')
{
if(cursor != l.begin()) cursor--;
}
if(cm == 'D')
{
if(cursor != l.end()) cursor++;
}
if(cm == 'B')
{
if(cursor != l.begin())
{
cursor--;
cursor = l.erase(cursor); // 커서값 갱신을 해줘야함 point!
}
}
if(cm == 'P')
{
char cm2;
cin >> cm2;
l.insert(cursor, cm2);
}
}
for(char tmp : l)
{
cout << tmp;
}
return 0;
}
iterator가 begin()일 때 앞으로 또 땡기면(cursor-- 하면)
정의되지 않은 동작이 발생하고 쓰레기 값이 나올 수 있어 유의해야한다
end()일 때도 마찬가지로 cursor++ 하면 안된다
erase함수 사용시 변수로 return값을 받아주지 않으면
컴파일 에러는 아니지만
그 뒤에도 반복자를 계속해서 사용한다면 문제가 될 수 있어
꼭 받아주는게 중요하다
추가로 list,vector,deque 등에서 end()는 맨 뒤 원소 다음 위치를 가리킨다
그래서 값으로 접근하면 정의되지 않은 동작 발생, 쓰레기값이 나오므로 주의해야한다
반복문 종료 조건이나 insert 삽입 위치 정도로만 사용하는 것이 적절하다
반응형
'algorithm > 연결 리스트' 카테고리의 다른 글
| [algorithm] 백준 1158번 요세푸스 문제 (0) | 2026.01.11 |
|---|---|
| [algorithm] 백준 5397번 키로거 (0) | 2026.01.11 |