백준 1406번: 에디터

kgh128·2023년 1월 27일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Baekjoon/p1406.java


1. 스택 2개 이용

커서를 기준으로 문자열을 왼쪽, 오른쪽으로 쪼개서 왼쪽 문자열은 leftStack에, 오른쪽 문자열은 rightStack에 넣는다. 따라서 커서는 두 스택의 top이 될 것이다.

  • 자바 스택 사용방법
import java.util.stack;
          .
          .
          .
    // 스택 객체 생성      
	Stack<Character> leftStack = new Stack<>();
    Stack<Character> rightStack = new Stack<>();
          .
          .
          .
    // 메소드 이용      
    if (!leftStack.isEmpty()) {      
    	rightStack.push(leftStack.pop());
    }    
          .
          .
          .

2. 입력 문자열 leftStack에 넣기

처음에는 커서가 문장의 맨 뒤에 위치하므로 입력 문자열은 모두 커서의 왼쪽에 위치한다. 따라서 초기에 편집기에 입력되어 있는 문자열을 leftStack에 넣는다.

이때, StringcharAt(index) 메소드를 이용한다. 이는 String 객체의 index번째 문자를 char로 변환하여 반환하는 메소드이다. 이를 통해 String인 입력 문자열의 각 문자를 char형으로 쪼개서 Character를 저장하는 스택에 넣는다.

String str = br.readLine();

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

3. 명령어 처리

- 명령어 L

leftStack의 가장 위에 있는 문자를 rightStack으로 옮겨주면 커서를 왼쪽으로 한 칸 옮긴 효과가 나타난다.

if (!leftStack.isEmpty()) {
	rightStack.push(leftStack.pop());
}

- 명령어 D

rightStack의 가장 위에 있는 문자를 leftStack으로 옮겨주면 커서를 오른쪽으로 한 칸 옮긴 효과가 나타난다.

if (!rightStack.isEmpty()) {
	leftStack.push(rightStack.pop());
}

- 명령어 B

커서 왼쪽에 있는 문자를 삭제하는 명령이므로 leftStack의 가장 위에 있는 문자를 pop()하면 된다.

if (!leftStack.isEmpty()) {
	leftStack.pop();
}

- 명령어 P $

두번째 인자로 받은 문자(예를 들어 $)를 커서 왼쪽에 추가하는 명령이므로 leftStack에 두번째 인자(command[1])를 push()하면 된다.

이때도 마찬가지로 command[1]String이고, leftStackCharacter를 저장하는 스택이므로 charAt() 메소드를 이용해서 char형으로 바꿔서 넣는다. command[1]는 어차피 한 문자로 이뤄진 String 이므로 가장 앞의 문자를 전달하면 된다. 따라서 charAt()에 0을 인자로 전달한다.

leftStack.push(command[1].charAt(0);

L, D, B 명령의 경우 커서가 문장의 맨 앞이거나 뒤이면 무시되는 명령이다. 그러므로 커서가 문장의 맨 앞이거나 뒤인지 확인해야 한다.

  • 커서가 맨 앞이면 커서 왼쪽에는 문자열이 존재하지 않으므로 leftStack이 비어있을 것이다. leftStack이 비어있지 않을 때만 명령을 수행한다.
if (!leftStack.isEmpty())
  • 커서가 맨 뒤이면 커서 오른쪽에는 문자열이 존재하지 않으므로 rightStack이 비어있을 것이다. rightStack이 비어있지 않을 때만 명령을 수행한다.
if (!rightStack.isEmpty())

이것을 체크하지 않아 처음에 예제 입력 2를 넣고 돌렸을 때 에러 떴다.


4. 최종 결과 출력

현재는 커서를 기준으로 문자열이 왼쪽, 오른쪽으로 쪼개진 상태이다. 최종 문자열을 출력하기 위해서는 두 스택의 문자열을 하나로 합쳐야한다. leftStack의 문자를 하나씩 pop()해서 rightStackpush()하면 rightStack에 최종 문자열이 top에서 bottom으로 순서대로 존재할 것이다.

while(!leftStack.isEmpty()) {
	rightStack.push(leftStack.pop());
}

rightStack의 top에서부터 순차적으로 pop()을 해서 출력 버퍼에 집어넣으면 최종 결과가 완성된다. 이를 그대로 출력하면 된다.

while(!rightStack.isEmpty()) {
	bw.append(rightStack.pop());
}

System.out.println(bw);

0개의 댓글