Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- member function pointer
- delete function
- conversion constructor
- suffix return type
- std::ostream
- vector capacity
- vector size
- virtual destructor
- std::vector
- std::endl
- C++
- 더 지니어스 양면포커
- virtual inheritance
- operator overloading
- constructor
- base from member
- virtual function
- diamond inheritance
- c++ basic practice
- return by reference
- increment operator
- placement new
- pointer to member data
- dynamic_cast
- discord bot
- this call
- std::cout
- virtual function table
- c++ multi chatting room
- new&delete
Archives
- Today
- Total
I'm FanJae.
[BOJ] 5397 키로거 (C++) 본문
1. 문제 링크
https://www.acmicpc.net/problem/5397
2. 문제 접근
- 이 문제의 핵심은 키로거에서 화살표나 백스페이스 등의 처리가 중요하다.
- 화살표 처리와 백스페이스 처리상 중간 삽입 / 삭제가 자유로워야 하기 때문에 list 등을 이용한 처리가 적합하다.
3. 문제 풀이
- 1406번 문제와 풀이 방법은 거의 같다.
- std::list와 list에 대한 iterator를 하나 선언한다.
- '<'인 경우, 맨 앞이 아닐때, iterator를 감소시킨다.
- '>'인 경우, 맨 끝이 아닐때, iteartor를 증가시킨다.
- '-'인 경우, 백스페이스(바로 왼쪽에 있는 값)을 제거해야 하기 때문에 iterator를 감소 시키고, 제거해야 한다.
- ABC라는 문자가 있다면, ABC라는 문자가 있다면 커서 값은 C 뒤쪽이다.
- std::list에서 remove는 정확하게 iterator 위치를 기준으로 이뤄지기 때문에 iterator를 한번 앞으로 당기고 제거한다.
- 단, 가장 앞 지점인 경우 iterator를 감소 시키지 않는다.
- 키로거가 비어있는 경우에는 삭제를 하지 않도록 체크도 필요하다.
4. 소스 코드(C++)
더보기
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
string data;
int T;
cin >> T;
while (T--)
{
list<char> editor;
list<char>::iterator cursor = editor.begin();
cin >> data;
for (int i = 0; i < data.length(); i++)
{
if (data[i] == '<')
{
if (cursor != editor.begin()) // 앞으로 이동 가능 여부 체크
{
cursor--;
}
}
else if (data[i] == '>')
{
if (cursor != editor.end()) // 뒤로 이동 가능 여부 체크
{
cursor++;
}
}
else if (data[i] == '-')
{
if(!editor.empty()) // 비어있지 않은 경우.
{
if (cursor != editor.begin()) // 커서가 맨 앞인 경우 지울 수 없음.
{
cursor--;
cursor = editor.erase(cursor);
}
}
}
else
{
editor.insert(cursor, data[i]);
}
}
for (auto iter = editor.begin(); iter != editor.end(); iter++)
{
cout << *iter;
}
cout << "\n";
}
}
'Algorithm' 카테고리의 다른 글
[BOJ] 2493 탑 (C++) (0) | 2024.10.29 |
---|---|
[BOJ] 1874 스택 수열 (C++) (0) | 2024.10.29 |
[BOJ] 10773 제로 (C++) (0) | 2024.10.28 |
[BOJ] 1158 요세푸스 문제 (C++) (0) | 2024.10.28 |
[BOJ] 1406 에디터 (C++) (0) | 2024.10.28 |
Comments