[문제링크]
https://www.acmicpc.net/problem/5397
[문제를 어떻게 이해했는가?]
1. 테스트 케이스의 개수 num을 입력받는다.
2. 각 테슽 케이스마다 문자열 하나를 처리
3. 두 개의 스택(Deque)를 준비한다
- left: 커서 왼쪽의 문자
- right: 커서 오른쪽의 문자
4. 문자열을 왼쪽부터 하나씩 확인
- 일반 문자
- left에 push한다
- <(왼쪽 화살표)
- left가 비어있지 않다면
- left.pop() 이후 right(push)
- >(오른쪽 화살표)
- right가 비어있지 않다면
- right.pop() 이후 left.push()
- - (백스페이스)
- left가 비어있지 않다면 pop을 진행
5. 모든 입력을 처리 후
- right를 역순으로 left뒤에 붙여서 출력
[코드]
import java.io.*;
import java.util.*;
public class Main {
/**
* 스택: 키로거(5397)
* 문자열이 10^6이니까 O(n)으로 풀어야 한다
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine()); // 입력받을 횟수
while(num-- > 0){
String str = br.readLine();
Deque<Character> left = new ArrayDeque<>();
Deque<Character> right = new ArrayDeque<>();
for(char c : str.toCharArray()){
if(c == '<') {// 왼쪽이동일 경우
if(!left.isEmpty()){ // 왼쪽이 비어있지 않다면
right.push(left.pop());
}
} else if (c == '>') { // 오른쪽이동일 경우
if(!right.isEmpty()) { // 오른쪽이 비어있지 않다면
left.push(right.pop());
}
} else if (c == '-') { // 백스페이스
if(!left.isEmpty()) {
left.pop();
}
} else {
left.push(c);
}
}
while(!left.isEmpty()) {
right.push(left.pop());
}
while(!right.isEmpty()) {
sb.append(right.pop());
}
sb.append('\n');
}
System.out.println(sb.toString());
}
}'codingTest > 백준' 카테고리의 다른 글
| [codingTest][백준] 큐2 (0) | 2026.01.25 |
|---|---|
| [codingTest][백준] 균형잡힌 세상 (0) | 2026.01.12 |
| [백준][DFS] 바이러스 (0) | 2025.10.08 |
| [백준] 스택(10828) (0) | 2023.03.08 |
| [백준] 11654번 아스키 코드 (0) | 2022.07.22 |