https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
풀이
아무 생각 없이 풀면 시간초과가 나는 문제다.. reverse함수를 썼다가 처음에 틀렸다.
배열을 뒤집을 때 진짜 뒤집지 말고 덱 자료구조와 어디가 앞인지 기록하며 풀이해야한다.
숫자 배열을 입력받을 때 [1,2,3] 이런 식으로 입력이 들어오므로
substring 함수를 사용해 [ ] 문자를 잘라내고 split(',') 함수를 사용해 숫자를 가져온다.
arrStr = br.readLine();
arrStr = arrStr.substring(1, arrStr.length()-1);
String[] split = arrStr.split(",");
for(int i=0; i<n; i++){
arr.add(Integer.parseInt(split[i]));
}
1. 덱에 숫자들을 순서대로 넣는다. / 덱의 방향이 오른쪽으로 간다는 의미의 변수를 생성한다. (boolean isRight = true)
2. 함수 문자열을 차례대로 확인한다.
2-1. 'R'이면 덱의 방향을 반대로 바꾼다. (isRight != isRight)
2-2. 'D'이면 덱이 비었는지 확인하고 비었으면 에러이므로 반복문을 빠져나온다.
2-3. 덱의 방향이 오른쪽이면 덱의 첫 번째 요소를 제거한다. (removeFirst)
2-4. 덱의 방향이 왼쪽이면 덱의 마지막 요소를 제거한다. (removeLast)
3. 에러 발생 시 'error'를 출력한다.
4. 에러가 아닐 시 StringBuilder를 통해 방향에 맞게 출력문을 만들어 출력한다.
전체 코드
package 구현;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
public class BOJ_5430_AC {
public static int T, n;
public static String func, arrStr;
public static ArrayDeque<Integer> arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for(int t=0; t<T; t++){
func = br.readLine();
n = Integer.parseInt(br.readLine());
arr = new ArrayDeque<>();
boolean isRight = true;
boolean isError = false;
arrStr = br.readLine();
arrStr = arrStr.substring(1, arrStr.length()-1);
String[] split = arrStr.split(",");
for(int i=0; i<n; i++){
arr.add(Integer.parseInt(split[i]));
}
for(int i=0; i<func.length(); i++){
if(func.charAt(i) == 'R'){
isRight = !isRight;
}else{
if(arr.isEmpty()){
isError = true;
break;
}
if(isRight){
arr.removeFirst();
}else{
arr.removeLast();
}
}
}
if(!isError){
if(isRight){
StringBuilder sb = new StringBuilder();
sb.append('[');
if(arr.isEmpty()){
}
else{
sb.append(arr.pollFirst());
while(!arr.isEmpty()){
sb.append(',');
sb.append(arr.pollFirst());
}
}
sb.append(']');
System.out.println(sb.toString());
}else{
StringBuilder sb = new StringBuilder();
sb.append('[');
if(arr.isEmpty()){
}
else{
sb.append(arr.pollLast());
while(!arr.isEmpty()){
sb.append(',');
sb.append(arr.pollLast());
}
}
sb.append(']');
System.out.println(sb.toString());
}
}
else{
System.out.println("error");
}
}
}
}
'Coding Test' 카테고리의 다른 글
[백준] 20058 마법사 상어와 파이어스톰 - 자바 (0) | 2022.04.09 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 - Python (0) | 2021.10.24 |
[프로그래머스] 2020 카카오 인턴십 - 경주로 건설 (JAVA) (0) | 2021.08.05 |
[프로그래머스] 디스크 컨트롤러 - JAVA (0) | 2021.08.03 |
[프로그래머스] 짝지어 제거하기 - JAVA (1) | 2021.07.31 |