[백준-실버2]1406 에디터 - Java

iamjinseo·2021년 11월 4일
0

문제풀이-Java

목록 보기
2/53

문제


처음에는 풀 때 Arraylist나 LinkedList로 해결하려고 했다
근데 잘 안됨
이유 : 배열, 문자열 방식의 삽입과 삭제 처리는 O(n)인데

문자열 길이가 엄청 김

결론 : 오래걸림


풀이

해결방안 : 스택을 사용하면 push와 pop으로 O(1)에 해결할 수 있음

package basic1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

//1406 에디터
/* 배열, 문자열 방식으로 처리하면 삭제와 삽입에 O(n)만큼 듬(문자열 길이만큼)
 * 커서 기준 왼쪽 스택과 오른쪽 스택으로 나눈다
 * 그럼 push와 pop할 때 O(1)만큼만 할 수 있음
 * */
public class B1406 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //입력용
		StringBuilder sb = new StringBuilder(); //출력용 문자열
		String str = br.readLine(); //문자열입력
		int N = Integer.parseInt(br.readLine()); //명령횟수
		
		/* 커서 기준 왼쪽 스택과 오른쪽 스택으로 나눈다 */
		Stack<Character>left = new Stack<>();
		Stack<Character>right = new Stack<>();
		
		/* 커서가 맨 뒤에 있으므로 왼쪽 스택에 전부 넣기 */
		for(int i=0; i<str.length(); i++) {
			left.push(str.charAt(i));
		}
		
		while(N-->0) {
			//command 입력
			String command = br.readLine();
			
			//명령어에 따른 수행
			switch (command.charAt(0)) {
			case 'L':
				if(!left.empty()) //커서가 문장 맨 앞일 시 무시 
					right.push(left.pop()); //커서를 왼쪽으로 옮김으로써 문자 이동
				break;
			case 'D':
				if(!right.empty()) //커서가 문장 맨 뒤일 시 무시
					left.push(right.pop());
				break;
			case 'B': //왼쪽 글자 삭제
				if(!left.empty()) //커서가 문장 맨 앞일 시 무시
					left.pop(); //커서 왼쪽 문자 삭제
				break;
			case 'P': //왼쪽에 글자 삽입
				left.push(command.charAt(2));
			default:
				break;
			}
		}
		/* 왼쪽 스택을 전부 오른쪽으로 옮기면 최종 문장 완성 */
		while(!left.empty())
			right.push(left.pop());
		
		/* 오른쪽 스택에서 전부 pop해서 문장 만들기 */
		while(!right.empty())
			sb.append(right.pop());
		
		System.out.println(sb);
	}
}

결과

profile
일단 뭐라도 해보는 중

0개의 댓글