티스토리 뷰

1. 문제

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

 

5397번: 키로거

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

www.acmicpc.net


2. 문제 풀이

#include <iostream>
#include <bits/stdc++.h>
#pragma warning (disable:4996)

using namespace std;

int n;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	while (n--) {
		list<char> L;
		string s; cin >> s;
		list<char>::iterator it = L.begin();
		for (auto e : s) {
			if (e == '<') {
				if (it != L.begin()) it--;
			}
			else if (e == '>') {
				if (it != L.end()) it++;
			}
			else if (e == '-') {
				if (it != L.begin()) {
					it--;
					it = L.erase(it);
				}
			}
			else
				L.insert(it, e);
		}
		for (auto e : L)
			cout << e;
		cout << '\n';
	}
}

 

 


3. 문제 평가 및 해설

 

리스트로 구현하는 문제이다. 처음에는 모든 문자를 리스트로 연결하고, 특수문자가 나오면 iterator을 처리해주고 리스트에서 삭제하려고 하였다. 구현은 나름 쉬웠으나, 스파게티 코드처럼 되었고 메모리상 오류가 너무 많이 났다. 

 

그래서 곰곰히 생각하다가, 특수문자는 따로 리스트에 추가하지 않고 iterator만 처리해주고, 문자를 만나면 리스트에 insert를 통해서 추가해주는 방법을 생각했다.

 

뭔가 쉬운 문제인거 같지만, 시간이 꽤 오래 걸렸다. 머리 속으로 구현하려고 하지말고, 직접 그리고 생각하면서 코딩하는 습관을 길러야 할 것 같다.

'백준(C++) > 문제풀이' 카테고리의 다른 글

[백준 2164/C++] 카드2  (0) 2023.07.16
[백준 2493/C++] 탑  (0) 2023.07.16
[백준 1158/C++] 요세푸스 문제  (0) 2023.07.15
[백준 3273/C++] 두 수의 합  (0) 2023.07.14
[백준1475/C++] 방번호  (0) 2023.07.13