[B0J]에디터(1406번)

PearLineZero
|2024. 11. 19. 11:57
티어 : 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를 삽입 

 

 

 

💡알고리즘 설계 

  1. 각 문자를 입력받은 것을 left 스택에 값을 넣어줌
  2. 명령어를 하나씩 처리
    • D: 커서를 오른쪽으로 이동 (문자를 rightleft로 이동). 
    • P x: 커서 왼쪽에 문자 x를 삽입 (left 스택에 push).
    • B: 커서 왼쪽의 문자를 삭제 (left 스택에서 pop).
    • L: 커서를 왼쪽으로 이동 (문자를 leftright로 이동).
  3. 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