[BAEKJOON] - 1406번 : 에디터

Kim Hyen Su·2024년 1월 16일
0

⏲️ 알고리즘

목록 보기
41/95

1406번 문제 링크

전에 풀었던 키로거 문제와 비슷한 '커서(cursor)' 개념이 나오는 문제였다.

바로 전날에 풀어서 그런지 바로 Stack 자료 구조를 사용하여 문제를 상대적으로 빠르게 풀었다.(30분)

어제도 느꼈지만 Stack 자료구조에 넣거나 제거하는 로직은 금방 구현하지만, 스택 내부 요소를 순서에 맞게 빼내어 출력하는 부분이 조금 더 생각을 필요로 하였다.

😀 성공

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;

public class Main{
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String initial = br.readLine();
        int N = initial.length();
        int M = Integer.parseInt(br.readLine());
        
        StringBuilder sb = new StringBuilder();        
        Stack<Character> prevStack = new Stack<>();
        Stack<Character> nextStack = new Stack<>();
        
        for(int i = 0; i < N; i++){
            prevStack.push(initial.charAt(i));
        }
        
        for(int i = 0; i < M; i++){
            String str = br.readLine();
            char ch = str.charAt(0);

            switch(String.valueOf(ch)){
                case "L" : 
                    if(prevStack.empty()){ break; }
                    nextStack.push(prevStack.pop());
                    break;
                case "D" :
                    if(nextStack.empty()){ break; }
                    prevStack.push(nextStack.pop());
                    break;
                case "B" :
                    if(prevStack.empty()){ break; }
                    prevStack.pop();
                    break;
                case "P" :
                    prevStack.push(str.charAt(2));
                    break;
            }
        }

		while(!prevStack.empty()){
			sb.append(prevStack.pop());
		}

        sb.reverse();

		while(!nextStack.empty()){
			sb.append(nextStack.pop());
		}

        br.close();
        System.out.println(sb);
    }
}

🤨 주의할 점

위 코드 제출 전 for()문으로 구현한 뒤 출력을 해보니 내부 요소 일부가 출력되지 않는 결과가 출력되었다.

원인은 간단했다. for문으로 돌리게 되면, stack의 사이즈로 크기를 조건항에 넣는 것이 일반적이다. 하지만, stack의 size()는 pop()하게 되면 줄어들게 된다. 예를 들면,

for( int i = 0 ; i < stack.size(); i++)
0 -> stack.pop() -> size 4 -> i++
1 -> stack.pop() -> size 3 -> i++
2 -> stack.pop() -> size 2 // 여기서 끝나버리게 된다. 
따라서, idex 0번과 1번의 요소가 출력되지 않는 현상 발생.

위와 같은 상황 때문에, 전부 출력되지 않기 때문에 stack.empty() 를 활용하여 while문으로 구현하거나, stack의 초기 사이즈를 변수에 별도로 담아서 for문을 돌려 출력헤줘야 한다.

profile
백엔드 서버 엔지니어

0개의 댓글