[백준/JAVA] 12919번: A와 B 2
📖 문제
https://www.acmicpc.net/problem/12919
💡 풀이 방식
• 재귀
S에서 T를 만드는 재귀를 수행하는 게 아니고,
T에서 문자열을 지우면서 S를 만드는 재귀를 수행하는 것이다.
[재귀 함수]
- (종료 조건) 첫 번째 문자열과 두 번째 문자열의 길이가 같고, 두 문자열이 같다면, 1을 출력한다. (같지 않다면 0을 출력한다.)
- 두 번째 문자열의 마지막 글자가 A인 경우> 마지막 글자를 하나 뺀 값을 재귀함수의 인자로 갖고 가 재귀를 수행한다.
- 두 번째 문자열의 맨 앞 글자가 B인 경우 > 맨 앞 글자를 하나 빼고, 뒤집은 값을 인자로 가져가 재귀를 수행한다.
🔺 코드
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
|
import java.util.*;
import java.io.*;
public class Main {
static String S, T;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
S = br.readLine();
T = br.readLine();
System.out.println(solve(S, T));
}
private static int solve(String s, String t) {
if(s.length() == t.length()) {
if(s.equals(t))
return 1;
return 0;
}
int ans = 0;
// 마지막 글자가 A인 경우
if(t.charAt(t.length() - 1) == 'A') {
ans += solve(s, t.substring(0, t.length() - 1)); // 마지막 글자 하나 빼기
}
// 맨 앞 글자가 B인 경우
if(t.charAt(0) == 'B') {
StringBuilder s1 = new StringBuilder(t.substring(1)); // 맨 앞 글자 하나 빼기
String newStr = s1.reverse().toString(); // 뒤집기
ans += solve(s, newStr);
}
return ans > 0 ? 1 : 0;
}
}
|
cs |
➕ 다른 풀이 방식
charAt() 메소드 안 사용하시고, startsWith()과 endsWith() 메소드를 사용하신 풀이
[백준] 12919번 : A와 B 2 - JAVA [자바]
https://www.acmicpc.net/problem/12919문자열, 브루트포스 문제이다.\[백준] 12904번 : A와 B - JAVA \[자바] 와 비슷하지만 다른 문제이다.이 문제 또한 S -> T 로 하려면 두가지 연산을 고려하여 골라야 하지만 T
velog.io
💦 어려웠던 점
- 맨 처음에는 S에서 T를 만들도록 모든 경우의 수를 돌리는 재귀를 실행했었고... 15%에서 시간 초과로 틀렸었다~~~ (아무래도 만드는 것보다 줄이는 편이 더 효율적일테니..)
- 그 다음에 T를 S로 만드는 재귀를 수행하면 되겠다! 해서 맨 뒤부터 문자를 없애면서 문제를 풀 생각을 했는데 그게 아니었다,,
🧐 새로 알게 된 내용
dfs 함수의 리턴값을 정답에 누적해 저장하는 것,,,
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
백준 12919 [자바] java A와 B 2
문제 링크: https://www.acmicpc.net/problem/12919 12919번: A와 B 2 수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류
dingdingmin-back-end-developer.tistory.com