본문 바로가기

Computer Science&Engineering/코딩테스트

[백준 1406] 에디터

문제 링크 www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

✅ 커서의 왼쪽에 들어가는 문자들과, 커서의 오른쪽에 들어가는 문자들을 따로 보관하였다. 커서가 움직일 때마다 왼쪽과 오른쪽 문자가 들어있는 배열에 push 하고 pop 하여 구현하였다. R의 최대는 600000 이고, L은 커서를 왼쪽으로 옮길 때 입력이 되기 때문에 (문자 입력+L 동작이 필요) 300000을 최대로 잡았다. C언어로 풀었는데, 아마 C++ 이나 파이썬에서는 stack 을 활용해서 더 쉽게 구현할 수 있을 것 같다. 

 

예제에서 매 명령마다 동작을 보여주면 다음과 같다.

 

 

# 동작 과정

abcd
3
P x
abcdx
L
abcd x
P y
abcdy x
abcdyx

 

빈 칸이 커서가 있는 곳이라고 생각하면 된다. 

 

 

 

# 동작 과정

abc
9
L
ab c
L
a bc
L
 abc
L
 abc
L
 abc
P x
x abc
L
 xabc
B
 xabc
P y
y xabc
yxabc

 

# 제출 코드

#include <stdio.h>
#define R_MAX 300000

char L[600000+10];
char R[R_MAX+10];

int main(){
	int left = 0, right = R_MAX, N = 0, op = 0;
	char add;
	scanf("%s", L);
	while(L[left++]); left--;
	scanf("%d", &N);
	while(N--){
		scanf("\n%c", &op);
		if ( op == 'P'){
			scanf(" %c", &add);
			L[left++] = add;
		}
		else if (op == 'L' && left != 0 ){
			R[right--] = L[--left];
			L[left] = '\0';
		}
		else if ( op == 'B' && left != 0){
			L[--left] = '\0';
		}
		else if ( op == 'D' && right!= R_MAX){
			L[left++] = R[++right];
			R[right] = '\0';
		}
		//printf("%s %s\n", L, &R[right+1]);
	}
	printf("%s%s", L, &R[right+1]);
}
반응형