티어 : Sliver 2
정답여부 : 오답
알고리즘 유형 : 자료구조, 스택, 연결리스트
시간 제한 : 0.3초
💡문제
● 에디터
💡입력1
abcd
3
P x
L
P y
💡출력1
abcdyx
💡입력2
abc
9
L
L
L
L
L
P x
L
B
P y
💡출력2
yxabc
💡입력 3
dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z
💡출력 3
yxz
💡문제 분석
커서를 통해서 해당 문자를 위치에 입력시켜 문자열을 출력하면 되는 문제
- L: 커서를 왼쪽으로 이동
- D: 커서를 오른쪽으로 이동
- B: 커서 왼쪽의 문자를 삭제
- P x: 커서 왼쪽에 문자 x를 삽입
💡알고리즘 설계
- 각 문자를 입력받은 것을 left 스택에 값을 넣어줌
- 명령어를 하나씩 처리
- D: 커서를 오른쪽으로 이동 (문자를 right → left로 이동).
- P x: 커서 왼쪽에 문자 x를 삽입 (left 스택에 push).
- B: 커서 왼쪽의 문자를 삭제 (left 스택에서 pop).
- L: 커서를 왼쪽으로 이동 (문자를 left → right로 이동).
- left 스택과 right 스택을 한번에 출력
💡시간복잡도
- O(N)
💡틀린 코드
package baekjoon_1406;
import java.io.*;
import java.util.*;
public class baekjoon_1406 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String N = br.readLine();
int M = Integer.parseInt(br.readLine());
Stack<Character>left = new Stack<>();
//ArrayList<Character> arrayList = new ArrayList<Character>();
Stack<Character> right = new Stack<>();
for(Character c : N.toCharArray()) {
left.add(c);
}
for(int i = 0; i < M; i++) {
String command = br.readLine();
}
}
}
💡 틀린 이유
처음 스택을 하나만 두고 시작했는데 그럼 뺴준 값을 List에 넣어줘야 하나 고민 했는데 스택을 2개 만드는것까지는 구현완료
그러나 각 명령어 처리를 어떻게 해야할지 고민... 어떻게 커서의 위치를 정해줘야하나 이게 가장 큰 문제
정답코드를 보니 switch문 사용하면 해결 완료.
💡정답 코드
package baekjoon_1406;
import java.io.*;
import java.util.*;
public class baekjoon_1406 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 입력 문자열
String N = br.readLine();
int M = Integer.parseInt(br.readLine()); // 명령어 개수
Stack<Character> left = new Stack<>();
Stack<Character> right = new Stack<>();
// 초기 문자열을 left 스택에 삽입
for (char c : N.toCharArray()) {
left.push(c);
}
// 명령어 처리
for (int i = 0; i < M; i++) {
String command = br.readLine();
switch (command.charAt(0)) {
case 'L': // 커서를 왼쪽으로
if (!left.isEmpty()) {
right.push(left.pop());
}
break;
case 'D': // 커서를 오른쪽으로
if (!right.isEmpty()) {
left.push(right.pop());
}
break;
case 'B': // 커서 왼쪽 문자 삭제
if (!left.isEmpty()) {
left.pop();
}
break;
case 'P': // 커서 왼쪽에 문자 추가
left.push(command.charAt(2)); // 'P x'에서 x를 가져옴
break;
}
}
// 결과 조합: left + right (right는 역순으로 추가)
while (!left.isEmpty()) {
right.push(left.pop());
}
while (!right.isEmpty()) {
sb.append(right.pop());
}
System.out.println(sb.toString());
}
}
💡 느낀점 or 기억할정보
아 ...아까운데 정말 어려운 문제이다... ㅎㅎ...
'CodingTest > Baekjoon' 카테고리의 다른 글
[B0J]괄호의 값(2504번) (0) | 2024.11.18 |
---|---|
[B0J]스택 수열(1874번) (1) | 2024.11.15 |
[B0J]괄호(9012번) (1) | 2024.11.14 |
[B0J]단어 뒤집기(9093번) (0) | 2024.11.13 |
[B0J]스택(10828번) (0) | 2024.11.12 |