[Algorithm/Java] 백준 5430번 - AC
https://www.acmicpc.net/problem/5430
📌 문제
문제 유형
- 구현
- 자료구조
- 문자열
- 파싱
문제 설명
입력
4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]
출력
[2,1]
error
[1,2,3,5,8]
error
🔍 문제 풀이
로직 순서
- 입력 배열 문자열에서 숫자만 파싱하여 Deque에 저장
- 명령어 문자열 순회
- R: 뒤집기 →
isReversed
토글 - D: 삭제
- 비어있으면
error
출력하고 종료 isReversed
여부에 따라 앞/뒤 삭제
- 비어있으면
- R: 뒤집기 →
- 최종 출력 시
isReversed
방향에 따라 pollFirst 또는 pollLast
문자열 파싱
다양한 방법이 있지만, 가장 간편해 보이는 StringTokenizer
을 사용하여 문자열을 파싱하였다.
입력 배열은 문자열로 주어지므로 StringTokenizer
를 사용하여 숫자만 추출한다.
StringTokenizer st = new StringTokenizer(input, "[],");
while (st.hasMoreTokens()) {
dq.offer(Integer.parseInt(st.nextToken()));
}
- 구분자
"[],"
를 기준으로 나누면 숫자만 남게 된다. - int 배열
[1,2,3,4]
->1
,2
,3
,4
로 분해됨
📌 놓친 점
isReversed = true
가 아니라,isReversed = !isReversed
로 상태를 관리해야 한다.- R이 여러번 나올 수 있기 때문
- D일 때만
dq.isEmpty()
체크 필요- R은 단순 방향 변경이므로 비어 있어도 문제 없기 때문
- error 발생 시 바로
continue
또는break
로 이후 출력을 건너뛰어야 한다.- 이후 출력 로직이 실행되면 불필요한 출력이 발생
isReversed= true
일 땐 앞이 아니라 뒤에서 삭제해야 하므로pollLast()
써야한다.- 뒤집기(R)는 실제 데이터를 뒤집는 게 아니라, 출력 방향만 토글하여 처리한다.
💻 전체 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while(t-->0) {
// 기본 입력
String p = br.readLine(); // 수행할 함수
int n = Integer.parseInt(br.readLine()); // 배열에 들어있는 수의 개수
String input = br.readLine(); // 배열에 들어있는 정수
// 문자열 파싱 후 Deque에 넣기
Deque<Integer> dq = new ArrayDeque<>();
StringTokenizer st = new StringTokenizer(input, "[],");
while (st.hasMoreTokens()) {
dq.offer(Integer.parseInt(st.nextToken()));
}
// 명령 실행 (R:뒤집기, D:삭제)
boolean isReversed = false;
boolean isError = false;
for(int i=0; i<p.length(); i++){
char c = p.charAt(i);
if(c=='R'){
isReversed = !isReversed; // 주의
}
else if(c=='D'){
if(dq.isEmpty()){
System.out.println("error");
isError = true;
break;
}
if(isReversed) dq.pollLast(); // 주의
else dq.pollFirst();
}
}
// 출력
if (!isError) {
StringBuilder sb = new StringBuilder();
sb.append("[");
while (!dq.isEmpty()) {
sb.append(isReversed ? dq.pollLast() : dq.pollFirst()); // 주의
if (!dq.isEmpty()) sb.append(",");
}
sb.append("]");
System.out.println(sb);
}
}
}
}
댓글남기기