PS/백준
[백준] 2529 부등호 (Java)
m5n
2024. 10. 14. 23:13
백준 2529 부등호 (Java)
출처
유형
브루트포스(완전 탐색), 백트래킹
배운점
- br.readLine() -> charArray
char[] cArray = br.readLine().toCharArray();
- 처음에 "< > > < <" 이 부등호 줄을 입력받을 때 위 처럼 구현을 했는데, 그렇게 되면 cArray에는 ' ' 공백까지 포함되어서 저장되어버린다.
어쩐지 로직은 아무리봐도 맞는데 안되더라
- 디버깅하면서 알았음
- br.readLine()으로 입력을 받아서 charArray로 변경하고 싶을 때는 공백을 먼저 없애준 후에 toCharArray()를 사용하자
char[] cArray = br.readLine().replace(" ", "").toCharArray();
느낀점
- 백트래킹을 구현할 때는 조건 설정부터 생각을 하자
- 어떤 조건일 때 실행을 할 것이고 어떤 조건일 때 넘어갈 것인지
- 재귀가 다시 돌아왔을 때 어떤 로직을 수행할 것인지
- 이전 문제인 꽃길을 풀면서 백트래킹 구현에서 먼저 생각해야할 점은
- 재귀를 끝내는 조건
- 참일때 어떤 로직을 수행할 것인지
- 거짓일때는 어떤 로직을 수행할 것인지
- 호출이 끝났을 때 visited[i] = false; 라던지 되돌려줘야할 부분이 있는지
- 이라고 생각했고, 이를 토대로 backTracking 함수의 인자부터 생각하면서 구현하니까 구현할 수 있었다.
- 처음으로 직접 구현해본 백트래킹이라서 매우매우 매우 뿌듯했다 ~! 할 수 있다 !
정리
- 완전 탐색을 해야한다고 판단이 되면 백트래킹을 고려하고, 이때 조건 설정을 잘 따져보자
import java.io.*;
import java.util.*;
public class boj2529 {
private static int n;
private static char[] cArray;
private static List<String> temp;
private static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
cArray = br.readLine().replace(" ", "").toCharArray();
List<Integer> list = new ArrayList<>();
temp = new ArrayList<>();
visited = new boolean[10];
backTracking(0, list);
System.out.println(temp.get(temp.size()-1));
System.out.println(temp.get(0));
}
private static void backTracking(int len, List<Integer> list) {
if(len == n+1) {
StringBuilder sb = new StringBuilder();
for(int elem: list) {
sb.append(elem);
}
temp.add(sb.toString());
}
else {
if(len == 0) {
for(int i = 0; i < 10; ++i) {
add(i, list);
backTracking(list.size(), list);
clear(i, list);
}
}
else {
char c = cArray[len-1];
for(int i = 0; i < 10; ++i) {
if(c == '<') {
if(!visited[i] && list.get(list.size()-1) < i) {
add(i, list);
backTracking(list.size(), list);
clear(i, list);
}
} else if (c == '>'){
if(!visited[i] && list.get(list.size()-1) > i) {
add(i, list);
backTracking(list.size(), list);
clear(i, list);
}
}
}
}
}
}
private static void add(int idx, List<Integer> list) {
list.add(idx);
visited[idx] = true;
}
private static void clear(int idx, List<Integer> list) {
list.remove(list.size()-1);
visited[idx] = false;
}
}