[BaekJoon] 5397 키로거 (java)

SeongWon Oh·2021년 9월 30일
0
post-thumbnail

🔗 문제 링크

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


👨🏻‍💻 StringBuilder로 작성한 코드 (런타임 에러)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int testCaseNum = sc.nextInt();
		
		String[] input = new String[testCaseNum];
		
		input[0] = sc.nextLine(); // 숫자 하나를 받고 다음 줄로 넘어가게 하기 위해서 임시로 한줄을 받음
		
		for (int i=0; i< testCaseNum; i++) {
			input[i] = sc.nextLine();
		}
		
		for (int i=0; i< testCaseNum; i++) {
			System.out.println(keyLogger(input[i]));
		}
		
	}
	
	public static String keyLogger(String input) {
		
		char[] keys = input.toCharArray();
		StringBuilder sb = new StringBuilder();
		
		int cursur = 0;
		for (int i=0; i< keys.length; i++) {
			if (keys[i] == '<') {
				if (cursur > 0)
					cursur--;
			}
			else if (keys[i] == '>') {
				if (cursur < sb.length())
					cursur++;
			}
			else if (keys[i] == '-') {
				if (sb.length() > 0 && cursur > 0) {
					sb.deleteCharAt(--cursur);
				}
			}
			else {
				sb.insert(cursur++, keys[i]);
			}
		}	
		return sb.toString();
	}

}

👨🏻‍💻 Stack으로 작성한 코드 (통과)

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int testCaseNum = Integer.parseInt(sc.nextLine());
		
		String[] input = new String[testCaseNum];
		
		for (int i=0; i< testCaseNum; i++) {
			input[i] = sc.nextLine();
		}
		
		for (int i=0; i< testCaseNum; i++) {
			System.out.println(keyLogger(input[i]));
		}
		
	}
	
	public static String keyLogger(String input) {
		
		char[] keys = input.toCharArray();
		Stack<Character> pre = new Stack<>();
		Stack<Character> post = new Stack<>();
		
		for (int i=0; i< keys.length; i++) {
			if (keys[i] == '>') {
				if (!post.isEmpty())
					pre.add(post.pop());
			}
			else if (keys[i] == '<') {
				if (!pre.isEmpty())
					post.add(pre.pop());
			}
			else if(keys[i] == '-') {
				if (!pre.isEmpty())
					pre.pop();
			}
			else {
				pre.add(keys[i]);
			}

		}
		
		while(!post.isEmpty()) {
			pre.add(post.pop());
		}
		
		StringBuilder sb = new StringBuilder();
		while(!pre.isEmpty()) {
			sb.append(pre.pop());
		}

		return sb.reverse().toString();
	}

}


📝 결론

처음에 문제를 StringBuilder를 사용하여 풀 때는 런타임 에러가 발생하였다.

아마도 StringBuilder에서 insert, delete를 하는데 많인 시간이 소요되어서 그런것 같다.

문제를 해결하지 못하여 해설 영상을 보니 String을 통해 문제를 푸는 것이 아닌 2개의 Stack을 사용하여 풀라고 하여 Stack으로 다시 구현을 해보았다.

커서의 위치를 중심으로 pre stack, post stack에 값을 각각 저장하고 <, >의 문자가 있으면 최상위에 위치한 값들을 pop하여 다른 stack에 이동시키는 방법으로 문제를 풀었더니 Runtime error를 해결할 수 있었다.

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글