거북이의 IT 공부

[백준 1406] 에디터 - C++ / 알고리즘 '연결 리스트' 본문

Baekjoon

[백준 1406] 에디터 - C++ / 알고리즘 '연결 리스트'

버니빈 2020. 3. 28. 00:38

문제

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

 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가

www.acmicpc.net

나의 코드

 

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

int main() {
	list<char> str;
	list<char>::iterator cursor;
	string init;
	char com, add;
	int m;

	cin.tie(0);
	ios_base::sync_with_stdio(false);

	cin >> init;

	for (int i = 0; i < init.size(); i++)
		str.push_back(init[i]);

	cin >> m;
	cursor = str.end();
	for (int i = 0; i < m; i++) {
		cin >> com;

		if (com == 'L') {
			if (cursor != str.begin())
				cursor--;
		}
		else if (com == 'D') {
			if (cursor != str.end())
				cursor++;
		}
		else if (com == 'B') {
			if (cursor != str.begin()) 
				cursor = str.erase(--cursor);
		}
		else if (com == 'P') {
			cin >> add;
			str.insert(cursor, add); //insert : 왼쪽에 요소 삽입
		}
	}
	for (list<char>::iterator itr = str.begin(); itr != str.end(); ++itr)
		cout << *itr;
}

 

배운점

1. cin.tie(0);  ios_base::sync_with_stdio(false);

endl보다 시간효율이 강해서 사용하는 편이지만

굳이 sync_with_stdio(false); 를 이용해서  C++ 입출력 객채를 가속시켜서 사용할 것이라면, scanf와 printf와 섞어서 사용하지 말 것이며, 싱글 쓰레드 환경에서만 사용(알고리즘 문제만 풀 때는 무조건 싱글스레드이므로 상관없지만 실무에선 쓰지말것)하고, 그래도 시간초과가 난다면 C 표준입출력 함수들을 사용하는 것을 추천하는 바입니다.

출처: https://eine.tistory.com/entry/CC-입출력-방법에-따른-속도-정리 [아인스트라세의 SW 블로그]

 

2. c++ 표준 입력 합수 cin

cin : 공백, 개행 무시!!!

      따라서 space 단위로 끊어서 입력 받을 수 있다.

cin.get() : 공백, 개행 포함

             문자만 입력 받음

cin.getline(변수의 주소, 최대 입력가능 문자수, 종결 문자)

: 공백, 개행 입력 받음

문자열만 입력받음

 

출처: https://luyin.tistory.com/334

 

[C++] 표준 입력 함수 cin, cin.get(), cin.getline()

1. cin => 에 존재 => 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져옴 => 공백, 개행 무시 => 개행 키보드 버퍼에 남겨둠 => space 단위로 끊어서 입력 받을 수 있다 cin은 문자와 문자열 모두 입..

luyin.tistory.com

3. list - insert()

: 반복자가 list.end()에 위치해도 push_back과 같은 효과를 발휘한다.

즉, 현재 반복자 위치의 왼쪽에 삽입한다.

(반대로 생각하면 반복자가 list.begin일 때 맨 첫 요소로 추가된다.)

Comments