c++ auto와 linked list
백준 길라잡이 문제집 등 적당한 실버~골드 사이 문제들 모아 놓은 문제집들 중에서 안 풀고 미뤄 온 문제들 중 하나였던 1406 에디터. 딱 보고 저번학기 때 배웠던 연결리스트가 생각났고, 일일이 구현할 생각에 귀찮아서 안 풀고 있었다. 문제집에 있는 초록색 '성공' 표시가 연속되어 있다가 딱 하나 빠져있는 게 보기 싫어서 눈 감고 풀었다.
typedef struct node{
int data;
node* next;
};
처음에는 위의 코드처럼 연결리스트를 하나 하나 구현하려고 했는데, STL 라이브러리에 스택도 있고, 큐도 있고, 하여튼 거의 모든 자료구조가 있는데 연결리스트도 하나 있지 않을까? 싶어서 구글링을 해보니
https://www.cplusplus.com/reference/list/list/
역시나 있었다. 선언 방식은 다른 자료구조와 비슷하다. 정답 코드를 참고하면 된다.
또 알고만 있고 사용하기는 엄두가 안 났던 auto를 사용해야 할 것 같다는 느낌이 들었다. 연결리스트는 다음 노드의 주소를 연결하기 때문이다. int로 표현이 안 될 것 같았고, 이것저것 찾아보다 auto를 처음 사용해 보았다.
https://docs.microsoft.com/ko-kr/cpp/cpp/auto-cpp?view=msvc-170
'초기화 식에서 선언된 변수의 형식을 추론합니다.' 라고 첫 줄에 적혀있는데, 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;
}
'자료구조, 알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[백준 2606] 바이러스 (0) | 2022.06.21 |
---|---|
[백준] 6588 골드바흐의 추측 (0) | 2022.04.02 |
[백준 4375] 모듈로 연산이란? (0) | 2022.02.16 |
[백준] 21-4분기 KING 알고리즘 스터디_정렬 (0) | 2022.01.18 |
[백준] 1920 C언어 (0) | 2021.12.25 |