문제
https://www.acmicpc.net/problem/1406
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
'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 |
댓글