article thumbnail image
Published 2022. 9. 28. 01:15

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

 

 

 

 

#include <iostream>
#include <list>
#include <string>
using namespace std;
string input;

int n;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> input;
    list<char> l;
    list<char>::iterator t = l.end();
    for (char c : input) {
      switch (c) {
        case '<':
          if (t == l.begin()) continue;
          t--;
          break;
        case '>':
          if (t == l.end()) continue;
          t++;
          break;
        case '-':
          if (t == l.begin()) continue;
          if (t == l.end()) {
            l.erase(--t);
            t = l.end();
          } else
            t = l.erase(--t);
          break;
        default:
          l.insert(t, c);
      }
    }
    for (char c : l) cout << c;
    cout << '\n';
  }
}

비밀번호에 대해 커서 이동과 임의의 위치에서 삭제 및 입력이 발생하기 때문에 연결리스트를 사용해서 풀었다.

비밀번호를 기억하기 위한 연결리스트 l를 선언하고, 커서를 나타내기 위해 변수 t에 l.end()를 할당한다. 

이후엔 강산이의 키보드 입력을 input 변수에 담아서 한 글자씩 꺼내어 switch문으로 처리했다.

 

'<'인 경우 커서가 맨 왼쪽에 있다면 해당 케이스를 무시하고, 아니라면 t--를 한다.

'>'인 경우 커서가 맨 오른쪽에 있다면 해당 케이스를 무시하고, 아니라면 t++를 한다.

'-'인 경우 커서가 맨 왼쪽에 있다면 해당 케이스를 무시하고, 아니라면 l.erase()로 커서 앞 문자를 지운다.

이때 --t를 인자로 넘겨주는 이유는 에디터 문제와 똑같은 이유로 커서 앞의 문자를 지워야하기 때문이다.

t가 l.end()일 때를 따로 처리해주는 이유는 erase 메소드의 특징 때문이다.

역시 에디터와 같은 문제라서 똑같은 방법으로 처리했다.

이 외의 경우에는 연결리스트에 넣어주면 된다.

 

 

 

 

 

 

'알고리즘' 카테고리의 다른 글

[BOJ] 10828: 스택  (0) 2022.09.28
[BOJ] 1158: 요세푸스 문제  (0) 2022.09.28
[BOJ] 1406: 에디터  (0) 2022.09.28
[BOJ] 10808: 알파벳 개수  (0) 2022.09.23
[BOJ] 3273: 두 수의 합  (0) 2022.09.22
복사했습니다!