본문 바로가기
Computer Science/Problem Solving(Algorithm)

< BOJ > 1406 - 에디터

by 진뚱 2019. 6. 2.
728x90

문제

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

 

1406번: 에디터

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

www.acmicpc.net

1406번: 에디터

1406번 제출 맞은 사람 숏코딩 풀이 풀이 작성 풀이 요청 재채점/수정 채점 현황 강의 에디터 풀이 시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율 2 초 128 MB 9854 2303 1599 23.384% 문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳

www.acmicpc.net

입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 N(1≤N≤500,000)이 주어진다. 셋째 줄부터 N개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

코드

#include<cstdio>
#include<vector>

using namespace std;

int main() {
	char str[600000] = {};
	int index=0;
	char choice;
	vector<char> left;
	vector<char> right;

	//input string
	while (1) {
		scanf("%c", &str[index]);
		if (str[index] == '\n') {
			str[index] = '\0';
			break;
		}
		else {
			left.push_back(str[index]);
			index++;
		}
	}

	int n;
	scanf("%d", &n);
	
	//main Program
	while (n--) {
		scanf("%c", &choice);
		scanf("%c", &choice);
		switch (choice) {
			case 'L':
				if (left.empty() == 0) {
					right.push_back(left.back());
					left.pop_back();
				}
				break;

			case 'D':
				if (right.empty() == 0) {
					left.push_back(right.back());
					right.pop_back();
				}
				break;

			case 'B':
				if (left.empty() == 0) {
					left.pop_back();
				}
				break;

			case 'P':
				char temp;
				scanf("%c", &temp);
				scanf("%c", &temp);
				left.push_back(temp);
				break;

			default:
				break;
		}

		
	}
	int left_size, right_size;
	left_size = left.size();
	right_size = right.size();
	for (int i = 0; i <left_size; i++) {
		printf("%c", left[i]);
	}
	for (int i = right_size-1; i >=0; i--) {
		printf("%c", right[i]);
	}
	return 0;
}

배운점

1. scanf("%c",&temp)

이 경우 공백을 처리하지 못하고 공백이 들어오면 그것을 입력받기 때문에 그것을 간단하게 해결 하기 위해 그냥 두번 받는 방법을 선택했다. 이것을 통해 공백이 들어온 버퍼를 무시하고 다음에 온 문자를 받을 수 있게 하였다.

2. stack이나 vector를 사용하여 그것을 출력할때는 순서에 주의해야한다.

오른쪽에는 들어간 순서대로 출력해주어야 하기 때문에 right부분을 출력을 거꾸로 해줌으로써 해결하였다.

GitHub

https://github.com/ryudonghun78/BJ_Algorithm/blob/master/stack/1406.cpp

 

728x90

'Computer Science > Problem Solving(Algorithm)' 카테고리의 다른 글

< BOJ > 2571 - 색종이-3  (0) 2019.06.04
< BOJ > 1912 - 연속합  (0) 2019.06.02
< BOJ > 10828 - 스택  (0) 2019.06.02
< BOJ > 11057 - 오르막 수  (0) 2019.06.02
< BOJ > 9012 - 괄호  (0) 2019.06.02

댓글