https://www.acmicpc.net/problem/12904
12904번: A와 B
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수
www.acmicpc.net
문제
- 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임
- 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능
1) 문자열의 뒤에 A를 추가한다.
2) 문자열을 뒤집고 뒤에 B를 추가한다.
-주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오.
처음에는 S에서 T로 만드는 여러가지 경우의 수를 생각했다
생각할수록 뻗어나갈 수 있는 경우의 수가 다양해서 아예 반대로 생각해보기로 했다 역으로 적용해서 지워가면서 T에서 S를 만들 수 있느냐를 따져보기!! 그러니까 문제가 간단해졌다
- 문자열의 뒤에 A 추가 → T의 끝에 A가 있다면 제거
- 문자열을 뒤집고 뒤에 B를 추가 → T의 끝에 B가 있다면 제거하고 문자열 뒤집기
그렇게 T의 끝을 지우거나 뒤집거나 하면서 S의 길이와 같아질때까지 반복하고, 최종적으로 S와 T가 같은지만 비교해보면 끝!
최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String S = br.readLine();
String T = br.readLine();
int result = 0;
// System.out.println(T.charAt(T.length()-1));
// T = T.substring(0,T.length()-1);
// System.out.println(T);
while (T.length() > S.length()) { // S와 T 길이가 같아지면 종료
int n = T.length()-1; // T의 마지막 문자 위치
if(T.charAt(n) == 'A') {
T = T.substring(0, n); // 맨 뒤에서 A 제거
} else { // T.charAt(n) == 'B"
T = T.substring(0, n); // 맨 뒤에서 B 제거
StringBuffer sb = new StringBuffer(T);
T = sb.reverse().toString(); // 뒤집기
}
}
if (S.equals(T)) result = 1;
System.out.println(result);
}
}
많은 문제를 풀어본건 아니지만,, 앞에서부터 접근할 때 많이 복잡하다면 반대로 뒤에서부터 접근하면 간단해지는 문제들이 꽤 있는거같다😎
'코딩테스트-알고리즘 > 백준 BOJ' 카테고리의 다른 글
[백준 BOJ/Gold V] 10026번 : 적록색약 (1) | 2024.02.12 |
---|---|
[백준 BOJ/Bronze III] 2501번 : 약수 구하기 (1) | 2024.02.11 |
[백준 BOJ/Gold V] 7576번 : 토마토 (0) | 2024.02.09 |
[백준 BOJ/Gold IV] 15961번 : 회전 초밥 (1) | 2024.02.07 |
[백준 BOJ/Silver I] 2531번 : 회전 초밥 (1) | 2024.02.03 |