[BaekJoon] 5397 키로거 (java)
🔗 문제 링크
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를 해결할 수 있었다.
Author And Source
이 문제에 관하여([BaekJoon] 5397 키로거 (java)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seongwon97/BaekJoon-5937-키로거-java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)