백준 5430 - Gold 5
https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
문제
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다.
AC는 정수 배열에 연산을 하기 위해 만든 언어이다.
이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다.
배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다.
예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.
예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다.
p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
출력
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다.
만약, 에러가 발생한 경우에는 error를 출력한다.
입력예제
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
이 문제에서는 reverse라는 뒤집기 기능이 존재한다.
[1,2,3,4]로 되어있는 배열을 뒤집으면 [4,3,2,1]이 되는것이다.
값을 넣을 때 반대로 뒤에서 넣거나 앞에서 넣을 때
흔히 사용하는 것이 바로 Deque(덱)이다.
덱은 양방향 큐이기 때문에 첫번째 값 혹은 마지막 값을
삽입하거나 삭제할 수 있다.
예제에서 나오듯 첫번째 조건은 RDD [1,2,3,4]로 예를 들어보겠다.
| 1 | 2 | 3 | 4 |
R
| 4 | 3 | 2 | 1 |
D
| 3 | 2 | 1 |
D
| 2 | 1 |
위와 같이 진행되는 것을 확인할 수 있다.
이 중에서 error가 될 확률은 하나밖에 없다.
삭제하라는 조건이 덱의 크기보다 클 경우이다.
그렇기에 dq.size()==0 return "error"를 해주면 된다.
이 문제에서는 int형 배열에 편하게 넣을 수 있게 값을 주는 것이 아니라,
[1,2,3,4] 이런식으로 String형태로 데이터를 넣어준다.
그래서 나는 값만 빼내기 위해서는
String.substring()함수와 .split()함수를 활용하였다.
쉽게 말하자면 substring()은 필요한 부분을 빼내는 것이고,
split()은 한 단어의 문자열을 통해서 잘라주는 역할을 한다.
String s = "Hello,World"라는 문자열이 입력되었을 경우,
String[] str = s.substring(0,s.length()).split(",");
| idx | str |
| 0 | Hello |
| 1 | World |
예를 들어서, [1,1,2,3,5,8]을 String형태로 받아왔다고 쳐보자.
String.substring(1,String.length()-1).split(",");
위처럼 해준다면,
맨 앞의 "["와 맨 뒤의 "]"가 사라진 상태로 배열에 저장될 것이다.
그 다음 나는 AC라는 StirngBuilder형 함수를 만들었다.
R이 존재한다면 앞뒤를 뒤집어줘야하기 때문에,
boolean형 reverse라는 변수도 하나 만든 후 진행하였다.
그 다음 조건으로는 D(Delete)가 존재한다.
D가 나왔을 때 사용되는 것이 reverse이다.
만약 reverse = true이면 덱의 가장 뒤에 있는 값을 삭제한다.
그렇지 않다면 가장 앞에 있는 값을 삭제하면 된다.
그 이후 StirngBuilder안의 덱의 크기가 0이 될때까지
값을 넣어주면 된다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static StringBuilder sb;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i = 0;i<t;i++) {
String p = sc.next();
int n = sc.nextInt();
String arr = sc.next();
Deque<Integer> dq = new LinkedList<>();
for(String s : arr.substring(1, arr.length()-1).split(",")) {
if(!s.equals("")) {
dq.offer(Integer.valueOf(s));
}
}
AC(dq,p);
System.out.println(sb);
}
sc.close();
}
static StringBuilder AC(Deque<Integer> dq, String s) {
sb = new StringBuilder();
boolean reverse = false;
for(char c : s.toCharArray()) {
if(c == 'R') {
reverse = !reverse;
}else {
if(dq.size()==0) {
sb.append("error");
return sb;
}
if(reverse) {
dq.removeLast();
}else {
dq.removeFirst();
}
}
}
sb.append("[");
while(!dq.isEmpty()) {
sb.append(reverse ? dq.removeLast() : dq.removeFirst());
if(dq.size()!=0) {
sb.append(",");
}
}
sb.append("]");
return sb;
}
}
|
cs |
'백준' 카테고리의 다른 글
| 백준 15989 (Java) 1, 2, 3 더하기 4 (2) | 2023.11.15 |
|---|---|
| 백준 11279 (Java) 최대 힙 (0) | 2023.07.03 |
| 백준 10026 (Java) 적록색약 (0) | 2023.06.27 |
| 백준 1920 (Java) 수 찾기 (0) | 2023.06.26 |
| 백준 9095 (Java) 1, 2, 3 더하기 (0) | 2023.06.26 |