백준 1406 에디터

노문택·2022년 2월 12일
0
post-thumbnail

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

스택 부터 차근차근 돌파해 골드1까지 갈계획이엿는데 실버3 전문제에서 막혀서 한번더 풀어보앗다.

Stack을 두개사용해서 커서이용을하는데...

커서를 기준으로 왼쪽 오른쪽으로 스택을 분리해두엇다..

그리고 커서이동시에 넣고빼고를 해주고 마지막에 두개를 합해보기..

그래서
코드는 다음과같앗다..

import java.io.BufferedReader;

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

public class 에디터 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		Stack<Character> s = new Stack<>();
		Stack<Character> q = new Stack<>();
		String line = br.readLine();
		for(int i=0;i<line.length();i++) {
			s.add(line.charAt(i));
		}
		int count = Integer.parseInt(br.readLine());
		
		for(int i=0;i<count;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			String type = st.nextToken();
			if(type.equals("P")) {
			s.add(st.nextToken().charAt(0));	
			}
			else if(type.equals("B")) {
				if(!s.isEmpty()) s.pop();
			}
			else if(type.equals("L")) {
				if(!s.isEmpty()) q.add(s.pop());
			}
			else {
				if(!q.isEmpty()) s.add(q.pop());
			}
		}
		while(!s.isEmpty()) {
			sb.insert(0,s.pop());
		}

		while(!q.isEmpty()) {
			sb.append(q.pop());
		}
		System.out.println(sb);
		
	}

}

결과는

52%에서 초과가난다..아무래도 찾아보니
String 비교파트에서 시간을 많이먹는듯해서

type.equals대신 char 비교로 바꿔주어서 풀어봣다..
그리고 q가 오른쪽큐 s가 왼쪽큐
그러나 insert대신 q의 넣어줌으로써 시간을줄여서 수정했다.

insert를 넣으니까 앞에다 넣을려고하니 계속 shift로 밀어주니 n만큼 계속늘어나서 시간초과가 날수밖에없었다..
문제는

while(!s.isEmpty()) {
			sb.insert(0,s.pop());
		}

여기파트이다.
해당파트를

	while(!s.isEmpty()) {
			q.add(s.pop());
		}

요렇게 바꿔준다 그러면

짜잔...아슬아슬..

수정된 코드는 다음과같다

import java.io.BufferedReader;

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

public class 에디터 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		Stack<Character> s = new Stack<>();
		Stack<Character> q = new Stack<>();
		String line = br.readLine();
		for(int i=0;i<line.length();i++) {
			s.add(line.charAt(i));
		}
		int count = Integer.parseInt(br.readLine());
		
		for(int i=0;i<count;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			char type = st.nextToken().charAt(0);
			if(type=='P') {
			s.add(st.nextToken().charAt(0));	
			}
			else if(type=='B') {
				if(!s.isEmpty()) s.pop();
			}
			else if(type=='L') {
				if(!s.isEmpty()) q.add(s.pop());
			}
			else {
				if(!q.isEmpty()) s.add(q.pop());
			}
		}
		while(!s.isEmpty()) {
			q.add(s.pop());
		}

		while(!q.isEmpty()) {
			sb.append(q.pop());
		}
		System.out.println(sb);
		
	}

}
profile
노력하는 뚠뚠이

0개의 댓글