이 문제는 연결리스트를 활용하는 간단한 문제이다.
연결리스트를 직접 구현해서 문제를 해결해도 상관없지만 나는 라이브러리에 있는 list를 사용해서 문제를 해결하였다.
문제해결방법
1. list를 선언한다.
2. iterator(반복자)를 활용해서 요소에 접근한다.
3. L을 입력받았을 때 반복자의 위치가 맨 앞이면 무시한다.
4. D를 입력받았을 때 반복자의 위치가 맨 뒤면 무시한다.
5. B를 입력받았을 때 반복자의 위치가 맨 앞이면 무시한다.
6. P를 입력받으면 문자를 추가한다.
list <char>::iterator it = l.begin();
list <char>::iterator it = l.end();
begin은 맨 앞(첫 번째 요소)을 의미하고 end는 맨 끝(빈 공간)을 의미한다.
만약 반복자가 end를 가리키고 있고 4를 erase로 삭제하게 된다면 이 반복자는 무효화된다.
그래서 다시 it=l.erase(it); 반복자의 위치를 받아와야 한다.
#include <iostream>
#include <list>
using namespace std;
int main(void)
{
string s = "";
int M = 0;
cin >> s >> M;
list<char>l;
for (int i = 0; i < s.size(); i++)
{
l.push_back(s[i]);
}
list<char>::iterator it = l.end();//리스트의 맨끝
for (int i = 0; i < M; i++)
{
char c = ' ';
cin >> c;
if (c == 'L')
{
if (it != l.begin())
{
advance(it, -1);
}
}
else if (c == 'D')
{
if (it != l.end())
{
advance(it, 1);
}
}
else if (c == 'B')
{
if (it != l.begin())
{
advance(it, -1);
it = l.erase(it);
}
}
else if (c == 'P')
{
cin >> c;
l.insert(it, c);
//그 자리에 c 삽입
}
}
for (char val : l)
{
cout << val;
}
return 0;
}
advance로 it의 위치를 옮긴다.
'백준 > 실랜디, 골랜디' 카테고리의 다른 글
[백준] 그림(1926) (0) | 2025.01.10 |
---|---|
[백준] C++ 스타트와 링크(14889) (0) | 2025.01.09 |
[백준] 좋다(1253) (0) | 2025.01.08 |
[백준] C++ 부분합(1806) (0) | 2025.01.08 |
[백준] 쉬운 최단거리(14940) (0) | 2024.12.29 |