Algorithm/Problem
A와 B 2(BJ_G5_12919)
당진개발자
2024. 6. 9. 21:06
1. 문제 링크
https://www.acmicpc.net/problem/12919
2. 나의 코드
메모리: 14316kb
시간: 108ms
코드 길이: 1107B
시간 복잡도 : O(N^2)
설명
- 완성된 문자열을 가지고 문자를 하나씩 없애가면서 DFS를 사용하였다.
- 만약 문자열의 길이가 짧아지면 멈추는 백트래킹을 사용하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_12919 {
static String from, to;
static int found = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
from = br.readLine();
to = br.readLine();
dfs(new StringBuilder(to));
System.out.println(found);
}
public static void dfs(StringBuilder sb) {
if (found == 1) return; // 이미 찾았다면 더 이상 탐색하지 않음
if (sb.toString().equals(from)) {
found = 1;
return;
}
if (sb.length() < from.length()) return;
if (sb.charAt(0) == 'B') {
StringBuilder newSb = new StringBuilder(sb);
newSb.deleteCharAt(0).reverse();
dfs(newSb);
}
if (sb.charAt(sb.length() - 1) == 'A') {
StringBuilder newSb = new StringBuilder(sb);
newSb.deleteCharAt(sb.length() - 1);
dfs(newSb);
}
}
}
3. 정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int k;
static String s, t;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s = br.readLine();
t = br.readLine();
k = t.length();
result = dfs(s, t);
System.out.println(result);
}
public static int dfs(String s, String t) {
if (s.length() == t.length()) {
if (s.equals(t)) {
return 1;
}
return 0;
}
int ans = 0;
if (t.charAt(0) == 'B') {
String substring = t.substring(1);
StringBuilder sb = new StringBuilder(substring);
String string = sb.reverse().toString();
ans += dfs(s, string);
}
if (t.charAt(t.length() - 1) == 'A') {
ans += dfs(s, t.substring(0, t.length() - 1));
}
return ans > 0 ? 1 : 0;
}
}
4. 배운 점
- 하나씩 추가해가면서 나가는게 아니고 왜 완성된 문자열을 뺄 생각을 그렇게 못했을까..? 항상 반대로도 생각해보자
- StringBuilder를 삭제, 뒤집기 같은 연산을 자주 할 경우 값이 이상해질 수 도 있다. 그렇기에 새로운 객체를 생성해서 dfs를 하는것이 좋다.