백준 1406 - 에디터

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

문제 해설

Stack을 이용한 문제 풀이

기본적인 자료구조를 사용해 문제를 해결하는 문제이다. 두개의 스택을 이용해서 커서를 기점으로 커서 왼쪽에 있는 것들은 left 스택에 커서 오른쪽에 있는 단어들은 right 스택에 넣어서 관리를 한다.

import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;

public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();

Stack<Character> left = new Stack<>();
Stack<Character> right = new Stack<>();

for (int i = 0; i < str.length(); i++) {
left.push(str.charAt(i));
}

int numOfCmd = sc.nextInt();

for (int i = 0; i < numOfCmd; i++) {
String cmd = sc.next();

if (cmd.equals("L")) {
if (!left.isEmpty()) {
right.push(left.peek());
left.pop();
}
} else if (cmd.equals("D")) {
if (!right.isEmpty()) {
left.push(right.peek());
right.pop();
}
} else if (cmd.equals("B")) {
if (!left.isEmpty()) {
left.pop();
}
} else if (cmd.equals("P")) {
char value = sc.next().charAt(0);
left.push(value);
}
}

while (!left.isEmpty()) {
right.push(left.peek());
left.pop();
}

StringBuilder stringBuilder = new StringBuilder();
while (!right.isEmpty()) {
stringBuilder.append(right.peek());
right.pop();
}

System.out.println(stringBuilder.toString());
}
}

LinkedList와 ListIterator를 이용한 문제 풀이

해당 문제는 LinkedList를 이용해서도 문제를 해결할 수 있다. LinkedList의 원소에 List로 접근을 하게 되면 O(n) 의 시간이 걸려 시간 초과가 뜨게 된다. 때문에 다행이 문제는 Cursor위치를 한칸씩 밖에 못 움직이므로 ListIterator 라는 객체를 이용해 LinkedList를 관리하도록 한다.

public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out));
String[] str = br.readLine().split("");

List<Character> charList = new LinkedList<>();
ListIterator<Character> iter = charList.listIterator();

for (int i = 0; i < str.length; i++) {
iter.add(str[i].charAt(0));
}

int index = charList.size();
int numOfCmd = Integer.parseInt(br.readLine());

for (int i = 0; i < numOfCmd; i++) {
char[] inputs = br.readLine().toCharArray();

if (inputs[0] == 'L') {
if (iter.hasPrevious()) {
iter.previous();
}
} else if (inputs[0] == 'D') {
if (iter.hasNext()) {
iter.next();
}
} else if (inputs[0] == 'B') {
if (iter.hasPrevious()) {
iter.previous();
iter.remove();
}

} else if (inputs[0] == 'P') {
char value = inputs[2];
iter.add(value);
}
}

for (char c : charList) {
wr.write(c);
}
wr.flush();
}
}
Share