Problem Solving/Java
백준 1406번 에디터 문제 Stack 활용 풀이 ( Java )
TakeKnowledge
2019. 9. 5. 15:46
반응형
1406번: 에디터
문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가
www.acmicpc.net
처음엔 ArrayList를 활용해서 풀었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
import java.io.*;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// reader 생성
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// writer 생성
ArrayList<Character> list = new ArrayList<Character>();
// list 생성
String input = br.readLine();
// String 입력받음
int cursor = input.length();
// 커서 위치
int max = input.length();
// 오른쪽 끝 위치
for (int i = 0; i < max; i++) {
list.add(input.charAt(i));
}
// 리스트에 글자 담음
String nStr = br.readLine();
int n = Integer.parseInt(nStr);
// 첫 라인을 읽고
// 첫 라인에서 입력받은 라인만큼 반복
for (int i = 0; i < n; i++) {
String command = br.readLine();
// 명령어 입력 받음
if (command.startsWith("L")) {
// 커서가 맨 왼쪽이 아니면
if (cursor > 0) {
// 왼쪽으로 이동
cursor--;
}
} else if (command.startsWith("D")) {
// 커서가 맨 오른쪽이 아니면
if (cursor < max) {
// 오른쪽으로 이동
cursor++;
}
} else if (command.startsWith("B")) {
// 커서가 맨 왼쪽이 아니면
if (cursor > 0) {
// 왼쪽 글자 삭제
list.remove(--cursor);
// 글자수도 하나 감소
max--;
}
} else if (command.startsWith("P")) {
String[] pCommand = command.split(" ");
// 커서 위치에 $ 입력
list.add(cursor, pCommand[1].toCharArray()[0]);
// 커서, 최대값 증가
cursor++;
max++;
}
}
// sb에 더해서
StringBuilder sb = new StringBuilder("");
for (char c : list) {
sb.append(c);
}
// 출력
bw.write(sb.toString());
br.close();
bw.flush();
bw.close();
// reader와 writer를 닫는다
}
}
|
이클립스에서 잘 작동하길래 백준에 제출해봤는데
시간초과가 떴다.
멘붕..
내 머리속에 떠오르던 유일한 방법이었기에
혼자 풀기를 포기하고 강의를 들었더니 Stack을 활용해 풀 수 있었다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
import java.io.*;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// reader 생성
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// writer 생성
Stack<Character> lStack = new Stack<Character>();
Stack<Character> rStack = new Stack<Character>();
// 스택 생성
String input = br.readLine();
for (int i = 0; i < input.length(); i++) {
lStack.push(input.charAt(i));
}
// 왼쪽 스택에 리스트에 글자 담음
String nStr = br.readLine();
int n = Integer.parseInt(nStr);
// 첫 라인을 읽고
// 첫 라인에서 입력받은 라인만큼 반복
for (int i = 0; i < n; i++) {
String command = br.readLine();
// 명령어 입력 받음
// 왼쪽이동
if (command.startsWith("L")) {
// 커서가 맨 왼쪽이 아니면
if(!lStack.empty()) {
rStack.push(lStack.pop());
}
// 오른쪽 이동
} else if (command.startsWith("D")) {
// 커서가 맨 오른쪽이 아니면
if(!rStack.empty()) {
lStack.push(rStack.pop());
}
// 커서 왼쪽 문자 삭제
} else if (command.startsWith("B")) {
// 커서가 맨 왼쪽이 아니면
if(!lStack.empty()) {
lStack.pop();
}
// 커서 왼쪽 문자 추가
} else if (command.startsWith("P")) {
String[] pCommand = command.split(" ");
lStack.push(pCommand[1].toCharArray()[0]);
}
}
// lStack이 빌때까지 오른쪽 스택으로 옮기고
while(!lStack.empty()) {
rStack.push(lStack.pop());
}
// rStack이 빌때까지
while(!rStack.empty()) {
//출력
bw.write(rStack.pop());
}
br.close();
bw.flush();
bw.close();
// reader와 writer를 닫는다
}
}
|
생각도 못했던 방법인데 너무 쉽게 풀 수 있어서 당황.
최백준 갓갓준..
반응형