<연결리스트> 백준 1406 에디터
2025. 3. 6. 00:22ㆍ원티드_언리얼RPG 2기/자료구조 스터디
작성코드
#include <iostream>
#include <list>
using namespace std;
int main()
{
string abc;
int M;
//입력받을 문자열의 개수 N, 명령어의 개수 M
cin >> abc >> M;
list<char> alphabets;
//입력받은 문자열을 리스트에 옮기기
for (char c : abc)
{
alphabets.push_back(c);
}
list<char>::iterator it;
it = alphabets.end();
for (int i = 0; i < M; i++)
{
//명령어 입력받기
char c;
cin >> c;
switch (c)
{
//커서를 왼쪽으로 한칸 옮김
case 'L':
if (it != alphabets.begin())
{
it--;
}
break;
case 'D':
if (it != alphabets.end())
{
it++;
}
break;
case 'B':
if (it != alphabets.begin())
{
it = alphabets.erase(--it);
//it++;
}
break;
case 'P':
char d;
cin >> d;
alphabets.insert(it, d);
break;
default:
break;
}
}
for (auto it = alphabets.begin(); it != alphabets.end(); it++)
{
cout << *it;
}
}
문제점
이터레이터의 문법에 대한 이해가 부족했다.
입력1,2는 문제가 없었는데 입력3에서 런타임 에러가 발생했다.
입력 3
dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z
출력 3
yxz
case 'B':
if (it != alphabets.begin())
{
it = alphabets.erase(it--); //it 가리키는 원소를 삭제하고 it을 감소시킨다
}
break;
switch문의 각 case들에 중단점을 걸어두고 확인해본 결과, erase에서 문제가 발생했다.
<이터레이터 무효화 문제>
이터레이터가 먼저 삭제되서 정확한 동작을 할 수 없게 되는 문제이다. 후위 감소연산자를 사용하면 삭제후 반환되는 이터레이터값이 불확실해져서 오류가 발생할 가능성이 높다. 따라서 전위 감소연산자 --it 을 사용하자
'원티드_언리얼RPG 2기 > 자료구조 스터디' 카테고리의 다른 글
이진탐색트리 (0) | 2025.03.17 |
---|---|
<배열,연결리스트> 백준 1158번 요세푸스 문제 (0) | 2025.03.04 |
2주차 배열, 벡터, 연결리스트 (0) | 2025.03.03 |
<덱deque> 백준 1021번 회전하는 큐 (0) | 2025.03.01 |
<스택> 백준 3986번 좋은 단어 (0) | 2025.03.01 |