백준 - 5430번 AC (골드 5)
2024. 3. 14. 10:10ㆍ코딩테스트 정리(자바)
728x90
1. 직접 뒤집어야 하나 생각했다.
그러나 그럴 필요가 없었다.
flag로 앞에서 뺄지 뒤에서 뺄지만 정하면 됨.
2.대괄호와 콤마를 제외하고 숫자만 남기기
-> 여러방법이 있겠지만 replaceAll() 을 사용했다
-> 숫자 또는 콤마를 ""으로 교체.
정규식을 쓸 때 대괄호를 중첩해서 쓰면 '또는' 가능
String s=br.readLine().replaceAll("[^0-9[,]]","")
* substring()으로 하는 방법도 있음
String s=br.readLine();
String[] number=s1.substring(1,s1.length()-1).split(",");
실패
: error를 출력하고 while문의 처음으로 돌아가고 싶은데 방법을 못찾았다.
-> 결국 따로 떼어내어 메소드를 만들기로 함.
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(System.out));
Deque<String> deq = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
boolean flag = true; //true면 앞에서부터 제거하고 false면 뒤에서부터 제거
while (T-- > 0) {
String[] str = br.readLine().split(""); //명령 담을 배열
int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수
String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거
//[a-d[m-p]] : a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다
String[] number = s.split(","); //콤마 기준으로 숫자들 구분
for (int i = 0; i < n; i++) { //숫자 덱에 담기
deq.add(number[i]);
}
flag=true; //flag 초기화
for (int i = 0; i < str.length; i++) {
if (str[i].equals("R")) //R이면 flag 바꾸기
flag = !flag;
else if (str[i].equals("D")) {//D이면 deq에서 숫자 제거
if (!deq.isEmpty()) {
if (flag) //앞에서부터 제거
deq.removeFirst();
else //뒤에서부터 제거
deq.removeLast();
} else {
bw.write("error\n");
break;
}
}
}
if(!deq.isEmpty()){
bw.write("[");
if(flag) {//앞에서부터 출력
while(deq.size()>1)
bw.write(deq.removeFirst()+",");
bw.write(deq.removeFirst());
bw.write("]\n");
}
else {//뒤에서부터 출력
while(deq.size()>1)
bw.write(deq.removeLast()+",");
bw.write(deq.removeLast());
bw.write("]\n");
}
}
}
bw.flush();
bw.close();
}
}
계속 실패해서 왜 그런가 찾아봤더니
빈 덱인 경우 [ ] 이렇게 출력을 해야 한다고 한다.
import java.io.*;
import java.util.*;
class Main {
static void AC(Deque <String> deq,String[] str,StringBuilder sb){
boolean flag = true; //flag 초기화
int size=str.length;
for (int i = 0; i < size; i++) {
if (str[i].equals("R")) //R이면 flag 바꾸기
flag = !flag;
else if (str[i].equals("D")) {//D이면 deq에서 숫자 제거
if (!deq.isEmpty()) {
if (flag) //앞에서부터 제거
deq.removeFirst();
else //뒤에서부터 제거
deq.removeLast();
} else {
sb.append("error\n");
return;
}
}
}
sb.append("[");
if(!deq.isEmpty()){
if(flag) {//앞에서부터 출력
while(deq.size()>1)
sb.append(deq.removeFirst()).append(",");
sb.append(deq.removeFirst());
}
else {//뒤에서부터 출력
while(deq.size()>1)
sb.append(deq.removeLast()).append(",");
sb.append(deq.removeLast());
}
}
sb.append("]\n");
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(System.out));
Deque<String> deq = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (T-- > 0) {
String[] str = br.readLine().split(""); //명령 담을 배열
int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수
String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거
String[] number = s.split(","); //콤마 기준으로 숫자들 구분
for (int i = 0; i < n; i++) { //숫자 덱에 담기
deq.add(number[i]);
}
AC(deq,str,sb);
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
*** 찾아보니 레이블로 continue 하는 방법이 있었음
import java.io.*;
import java.util.*;
class Main {
static void AC(Deque <String> deq,String[] str,StringBuilder sb){
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(System.out));
Deque<String> deq = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
Loop: while (T-- > 0) {
String[] str = br.readLine().split(""); //명령 담을 배열
int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수
String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거
String[] number = s.split(","); //콤마 기준으로 숫자들 구분
for (int i = 0; i < n; i++) { //숫자 덱에 담기
deq.add(number[i]);
}
boolean flag = true; //flag 초기화
int size=str.length;
for (int i = 0; i < size; i++) {
if (str[i].equals("R")) //R이면 flag 바꾸기
flag = !flag;
else {//D이면 deq에서 숫자 제거
if (!deq.isEmpty()) {
if (flag) //앞에서부터 제거
deq.removeFirst();
else //뒤에서부터 제거
deq.removeLast();
} else {
sb.append("error\n");
continue Loop;
}
}
}
sb.append("[");
if(!deq.isEmpty()){
if(flag) {//앞에서부터 출력
while(deq.size()>1)
sb.append(deq.removeFirst()).append(",");
sb.append(deq.removeFirst());
}
else {//뒤에서부터 출력
while(deq.size()>1)
sb.append(deq.removeLast()).append(",");
sb.append(deq.removeLast());
}
}
sb.append("]\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}728x90
'코딩테스트 정리(자바)' 카테고리의 다른 글
| 백준 - 2504번 괄호의 값 (골드 5) (0) | 2024.03.16 |
|---|---|
| 백준 - 10799번 쇠막대기 (0) | 2024.03.15 |
| 백준 - 1021번 회전하는 큐 (실버 3) (2) | 2024.03.12 |
| 백준 - 큐2 (18258번) 실버 4 (0) | 2024.03.11 |
| 백준 - 6198번 옥상 정원 꾸미기 (0) | 2024.03.09 |