꾸물꾸물 졔의 개발공부
[백준] 12904 A와 B - JAVA 본문
https://www.acmicpc.net/problem/12904
12904번: A와 B
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수
www.acmicpc.net
[풀이]
- S → T 찾기(X) , T → S 찾기(O)
- 주어진 문자열 S에서 할 수 있는 방법은 A를 추가하거나, B를 추가하거나 (+뒤집기) 두개 다 가능하다.
- 반대로 T에서 가능한 방법은 , 아래와 같이 가장 끝 문자가 무엇이냐에 따라 하나만 가능하다.
1. 가장 끝 단어가 'A' 일경우 : A 빼기
2. 가장 끝 단어가 'B' 일 경우: B 빼고 뒤집기 - 따라서 S에서 T를 찾는 것보다 T에서 끝문자가 무엇이냐에 따라 연산하며 S를 찾는것이 더 효율적이다.
[구현 과정]
- DeleteLast() : 문자열의 가장 마지막 문자 제거하는 메소드
- Reverse() : 문자열 뒤집는 메소드
🌟T의 길이가 S의 길이보다 짧아질 수는 없다. (S에서 가능한 연산은 'A' 또는 'B'를 추가하는 것이므로)
1. 두 문자열을 입력받아 s,t에 저장한다.
2. t의 길이가 s의 길이보다 길 동안만 아래의 과정을 반복한다.
- t 문자열의 가장 끝 문자를 last 변수에 저장한다. (charAt 사용)
- last의 값에 따라 아래 두개의 경우 중 하나를 실행한다.
- last가 'A'일 경우 : t에서 가장 끝 문자를 제거한다. ▶DeleteLast()
- last가 'B'일 경우 : t에서 가장 끝 문자열을 제거한 후, 뒤집는다. ▶DeleteLast() > Reverse()
- 만약 t가 s와 동일하다면 1을 출력하고 프로그램을 종료한다.
3. 위 반복문이 종료되었을 경우 (t의 길이가 s보다 짧아졌을 경우), 가능한 연산이 없으므로 0을 출력한다.
[소스 코드]
import java.io.*;
public class Main {
static String t;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s= br.readLine();
t= br.readLine();
while(t.length() > s.length()) {
char last = t.charAt(t.length()-1);
//만약 A라면 , A를 빼는 거 밖에 방법이 없음
if(last== 'A') DeleteLast();
//만약 B라면, B를 빼고 뒤집는 거 밖에 방법이 없음
else {
DeleteLast();
Reverse();
}
if(t.equals(s)) {
System.out.println(1);
return;
}
}
System.out.println(0);
}//end of main
//마지막 뒤에 한 단어 빼기
private static void DeleteLast() {
t= t.substring(0, t.length()-1);
}
//문자열 뒤집기
private static void Reverse() {
String rev ="";
for(int i=t.length()-1; i>=0; i--) {
rev += t.charAt(i);
}
t=rev;
}
}//end of class
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 12919 A와 B 2 - JAVA (0) | 2023.09.08 |
---|---|
[백준] 5052 전화번호 목록 - JAVA (0) | 2023.09.07 |
[백준] 17471 게리맨더링 - JAVA (0) | 2023.09.05 |
[백준] 1068 트리 - JAVA (0) | 2023.09.04 |
[백준] 2294 동전 2 - JAVA (0) | 2023.09.01 |