어제의 나보다 성장한 오늘의 나

[백준][12904][Java] A와 B 본문

알고리즘/백준(BOJ)

[백준][12904][Java] A와 B

NineOne 2021. 3. 30. 20:09

https://www.acmicpc.net/problem/12904

 

12904번: A와 B

수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수

www.acmicpc.net

문제풀이

문제를 딱 보자마자 완전 탐색을 하면 되겠다 생각했지만 최악의 경우 S가 1이고 T가 1000일 경우 BFS를 1000번 실행하기 때문에 스택오버플로우가 발생한다.

 

다르게 생각한 방법으론 Queue를 이용해서 A와 B를 더하면서 체크하는 방법이었는데 이 방법 또한 최악의 경우 2^1000 만큼의 값을 Queue에 담기 때문에 메모리 초과가 났다.

 

그래서 생각한 방법은 S를 기준으로 잡지 않고 T를 기준으로 잡아 마지막 문자가 A 인경우는 그냥 지워주고

B 인 경우는 문자열을 뒤집어 주었다. 문자를 하나씩 줄이면서 S와 길이가 같아졌을때 S와 T를 비교해서 맞다면 S로 T를 만들 수 있다.

 

코드

import java.io.*;
import java.util.*;

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;
		int size = T.length();
		
		for(int i=0; i<size; i++) {
			char c = T.charAt(T.length()-1);
			
			T = T.substring(0,T.length()-1);
			
            // B인 경우 뒤집어 준다.
			if(c == 'B') {
				StringBuilder sb = new StringBuilder(T);
				T = sb.reverse().toString();
			}
			
            // S와 길이가 같다면 S와 T 비교
			if(S.length() == T.length()) {
				if(S.equals(T)) result =1;
				break;
			}
		}
        
		System.out.println(result);
	}
}

'알고리즘 > 백준(BOJ)' 카테고리의 다른 글

[백준][12871][Java] 무한 문자열  (0) 2021.03.30
[백준][11399][Java] ATM  (0) 2021.03.30
[백준][17142][Java] 연구소 3  (0) 2021.01.19
[백준][16236][Java] 아기 상어  (0) 2021.01.18
[백준][16234][Java] 인구 이동  (0) 2021.01.17
Comments