본문 바로가기
자료구조, 알고리즘/백준 문제풀이

[백준] 1406 에디터

by 선의 2022. 3. 6.

c++ auto와 linked list

백준 길라잡이 문제집 등 적당한 실버~골드 사이 문제들 모아 놓은 문제집들 중에서 안 풀고 미뤄 온 문제들 중 하나였던 1406 에디터. 딱 보고 저번학기 때 배웠던 연결리스트가 생각났고, 일일이 구현할 생각에 귀찮아서 안 풀고 있었다. 문제집에 있는 초록색 '성공' 표시가 연속되어 있다가 딱 하나 빠져있는 게 보기 싫어서 눈 감고 풀었다.

 

typedef struct node{
	int data;
    node* next;
};

처음에는  위의 코드처럼 연결리스트를 하나 하나 구현하려고 했는데, STL 라이브러리에 스택도 있고, 큐도 있고, 하여튼 거의 모든 자료구조가 있는데 연결리스트도 하나 있지 않을까? 싶어서 구글링을 해보니

https://www.cplusplus.com/reference/list/list/

 

list - C++ Reference

difference_typea signed integral type, identical to: iterator_traits ::difference_type usually the same as ptrdiff_t

www.cplusplus.com

역시나 있었다. 선언 방식은 다른 자료구조와 비슷하다. 정답 코드를 참고하면 된다.

 

또 알고만 있고 사용하기는 엄두가 안 났던 auto를 사용해야 할 것 같다는 느낌이 들었다. 연결리스트는 다음 노드의 주소를 연결하기 때문이다. int로 표현이 안 될 것 같았고, 이것저것 찾아보다 auto를 처음 사용해 보았다.

https://docs.microsoft.com/ko-kr/cpp/cpp/auto-cpp?view=msvc-170 

 

auto(C++)

자세한 정보: 'auto'(C++)

docs.microsoft.com

'초기화 식에서 선언된 변수의 형식을 추론합니다.' 라고 첫 줄에 적혀있는데, auto는 변수의 타입을 유추한다. 아무 상황에서나 쓰는 것 같진 않고, 포인터(데이터 주소값)처럼 다루기 까다로울 때 주로 사용하는 것 같다(아니면 알려주세요). 함수 파라미터로는 사용할 수 없다.

 

이렇게 위의 stl <list>와 변수의 타입을 유추하는 auto에 대해 짧게 구글링하고 문제를 풀었다. 정답 코드는 다음과 같다.

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


int main(void) {

	string s;
	cin >> s;
	int m;
	cin >> m;
	list<char> l(s.begin(), s.end());
	auto cur = l.end();

	while (m--) {
		char input;
		cin >> input;

		if (input == 'L') {
			if (cur != l.begin()) {
				cur--;
			}
		}
		else if (input == 'D') {
			if (cur != l.end()) {
				cur++;
			}
		}
		else if (input == 'B') {
			if (cur != l.begin()) {
				cur = l.erase(--cur);
			}
		}
		else if (input == 'P') {
			char c;
			cin >> c;
			l.insert(cur, c);
		}
	}

	for (auto it = l.begin(); it != l.end(); it++) {
		cout << *it;
	}

	return 0;
}