키로커

문제 링크: https://www.acmicpc.net/problem/5397

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이

www.acmicpc.net

 

list와 그 반복자를 이용하여 문제를 해결했다.
방향키 조절은 iterator의 --,++ 연산으로 수행했고,
백스페이스 연산은 iter가 가지고 있는 원소 이전의 데이터를 제거해야 하므로 이전 데이터를 제거하고 다음의 데이터를 가져온다.

 

  • 정답 코드

      #include<iostream>
      #include<string>
      #include<list>
      using namespace std;
    
      list<char> li;
      list<char>::iterator iter = li.begin();
      void goLeft() {
          if (!li.empty() && iter != li.begin())
              --iter;
      }
      void goRight() {
          if (!li.empty() && iter != li.end())
              ++iter;
      }
      void remove() {
    
      }
      int main() {
          int n;
          cin >> n;
          while (n--) {
    
              li.clear();
              iter = li.begin();
    
              string str;
              cin >> str;
    
              for (int i = 0; i < str.size(); i++) {
                  char c = str.at(i);
                  if (c == '<') {
                      goLeft();
                  }
                  else if (c == '>') {
                      goRight();
                  }
                  else if (c == '-') {
                      if (!li.empty()) {
                          if (iter == li.end())
                              li.pop_back();
                          else if (iter == li.begin())
                              continue;
                          else {
                              goLeft();
                              iter = li.erase(iter);
                          }
                      }
                  }
                  else {
                      if (li.empty()) {
                          li.push_front(c);
                          iter = li.end();
                      }
                      else
                          li.insert(iter, c);
                  }
              }
              if(!li.empty())
                  for (iter = li.begin(); iter != li.end(); ++iter)
                      cout << *iter;
              cout << endl;
          }
          return 0;
      }

'ProblemSolving' 카테고리의 다른 글

[BOJ] 10546_배부른 마라토너  (0) 2021.02.06
[BOJ] 7785_회사에 있는 사람  (0) 2021.02.05
[BOJ] 3085_사탕게임  (4) 2021.02.03
[BOJ] 1074_Z  (0) 2021.02.02
[BOJ] 1309_동물원  (0) 2021.02.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기