꾸물꾸물 졔의 개발공부
[백준] 12919 A와 B 2 - JAVA 본문
https://www.acmicpc.net/problem/12919
12919번: A와 B 2
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈
www.acmicpc.net
[12904 A와 B] 아주x10000 약간 업그레이드 문제 🫠
[풀이]
- A와 B (12904) 문제와 거의 비슷하다.
- 마찬가지로 S → T (x) , T → S 일때 가능한 경우의 수가 더 적다.
- S에서 할 수 있는 방법은 A를 추가하거나, B를 추가하고 뒤집거나 두개 다 가능하다.
- 반대로 T에서 가능한 방법은, 각 조건에 따라 하나만 가능하거나 아예 안된다.
1. 가장 끝 단어가 'A' 일경우 : 가장 끝에 있는 A 빼기
2. 가장 "첫" 단어가 'B' 일경우 : 뒤집고 가장 "끝"에 있는 B 빼기
( 만약, 가장 첫단어가 'A'이고 끝단어가 'B'라면 (ex: ABB) 아무 것도 할 수 없다. - B를 추가 한 후에 뒤집는 것이기 때문에 반대로 T에서 탐색한다면 뒤집고 (가장 끝) B를 빼는 것이다.
BFS 탐색을 통해, 하나의 문자열에 대해 가능한 경우의 문자열을 Queue에 넣어서 s와 같은 값이 되면 1
[소스 코드]
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s= br.readLine();
String t= br.readLine();
System.out.println(bfs(s, t));
}
private static int bfs(String s, String t) {
Queue<String> que= new LinkedList<>();
que.add(t);
while(!que.isEmpty()) {
String find = que.poll();
if(find.equals(s)) return 1;
if(find.length() < s.length()) return 0;
//제일 마지막 글자가 a여야 지만 A를 뺄 수 있다.
if(find.charAt(find.length()-1) == 'A')
que.add(case1(find));
if(find.charAt(0) == 'B')
que.add(case2(find));
}
return 0;
}
private static String case1(String s) {
s = s.substring(0, s.length()-1);
return s;
}
private static String case2(String s) {
String rev = "";
for(int i=s.length()-1; i>=0; i--) {
rev += s.charAt(i);
}
return rev.substring(0, rev.length()-1);
}
}//end of class
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 20055 컨베이어 벨트 위의 로봇 - JAVA (0) | 2023.09.11 |
---|---|
[백준] 16918 봄버맨 - JAVA (0) | 2023.09.11 |
[백준] 5052 전화번호 목록 - JAVA (0) | 2023.09.07 |
[백준] 12904 A와 B - JAVA (0) | 2023.09.06 |
[백준] 17471 게리맨더링 - JAVA (0) | 2023.09.05 |