https://www.acmicpc.net/problem/12919
12919번: A와 B 2
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈
www.acmicpc.net
코드설명
DFS를 활용한 완전탐색 문제입니다.
처음에 시간초과가 났었습니다.
문제에 주어진대로, S에서 T로 가는 2가지 과정을 구현했으나,
입력조건에 첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 49, 2 ≤ T의 길이 ≤ 50, S의 길이 < T의 길이)
이러한 조건에서 S가 만약 1의 길이이고, T가 50의 길이라면, 최악의 경우 2^50 의 연산이 필요합니다.
그렇게하지않고, T -> S로 가능한지 확인해가면 시간초과가 일어나지않습니다.
로직은,
- T의 맨 뒷자리가 'A' 일경우 'A'를 빼서 진행합니다.
- T의 REVERSE 한 맨 뒷자리가 'B'일경우 'B'를 빼서 진행합니다.
위의 방식을 통해 T->S로 찾아가면, 50번의 연산만 진행하면 됩니다.
Java 문법적으로 String과 StringBuilder에 대해 알아야할점은,
StringBuilder의 reverse 함수와 StringBuilder를 substring할시 String으로 변환되어 나온다는 것을 알아야합니다.
또한 String의 값을 비교하기 위해서는 equals를 사용해야합니다.
코드
시간초과
S -> T로 찾아가는 과정을 나타낸 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int N; public static int[][] map; public static String S, T; public static int result = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); S = st.nextToken(); st = new StringTokenizer(br.readLine()); T = st.nextToken(); simulate(new StringBuilder(S), 0); System.out.println(result); } public static void simulate(StringBuilder sb, int level) { if(sb.length() > T.length()) { return ; } if(sb.toString().equals(T) ) { result = 1; return ; } StringBuilder nsb = new StringBuilder(sb); simulate(nsb.append('A'), level + 1); nsb.deleteCharAt(nsb.length() - 1); simulate(new StringBuilder(sb.append('B').reverse()), level + 1); } }
정답코드
T -> S 로 찾아가는 과정을 나타낸 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int N; public static int[][] map; public static String S, T; public static int result = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); S = st.nextToken(); st = new StringTokenizer(br.readLine()); T = st.nextToken(); simulate(S, T, T.length() - 1); System.out.println(result); } public static void simulate(String s, String t, int lastIdx) { if(s.length() == t.length()) { if(s.equals(t)) { result = 1; } return ; } //마지막숫자가 A인지 확인하고 맞다면 제거한뒤 진행 if(t.charAt(lastIdx) == 'A') { simulate(s, t.substring(0, lastIdx), lastIdx-1); } //문자열을 뒤집은 후에, 마지막 숫자가 B인지 확인하고 맞다면 제거한뒤 진행 StringBuilder sb = new StringBuilder(t).reverse(); if(sb.charAt(lastIdx) == 'B') { simulate(s, sb.substring(0, lastIdx), lastIdx - 1); } } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 21278 호석이 두 마리 치킨 - DFS(조합) + BFS JAVA (0) | 2023.07.17 |
---|---|
[백준] 1025 제곱수 찾기 - 완전탐색 + 아이디어 JAVA (0) | 2023.07.17 |
[백준] 15661 링크와 스타트 - 완전탐색 (DFS) JAVA (0) | 2023.07.16 |
[백준] 2615 오목 - 완전탐색 (DFS) JAVA (0) | 2023.07.16 |
[백준] 2961 도영이가 만든 맛있는 음식 - 완전탐색 (DFS) JAVA (0) | 2023.07.15 |