백준 12919 A와 B 2

wook2·2022년 11월 8일
0

알고리즘

목록 보기
114/117

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

브루트 포스적으로 해결하는 문제.
연산에는 2종류가 있는데 각각의 경우의 수 마다 2개의 연산을 실행하면 연산량이 너무 많아져 할 수 없다.

호출을 줄이기 위해 뒤집은 문자열이나 원래 문자열의 substring이 아니라면, 해당 문자열 이후로는 가지치기를 멈췄다.

다른 사람들의 풀이를 보니, S -> T로 가는게 아니라 T -> S로 백트래킹을 써서 문제를 해결했다.

1) 파이썬 코드

s = list(input())
t = list(input())
t = ''.join(t)
reversed_t = t[::-1]
ans = 0
def check(string):
    if string in t or string in reversed_t:
        return True
    else:
        return False

def solve(k):
    global ans
    if len(k) == len(t):
        if k == t:
            ans = 1
        return
    temp = k
    temp += 'A'
    if check(temp):
        solve(temp)
    temp = k
    temp += 'B'
    temp = temp[::-1]
    if check(temp):
        solve(temp)

solve(''.join(s))
print(ans)

2) 자바 코드

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

public class Main {
    private static String S;
    private static int ans = 0;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        S = br.readLine();
        String T = br.readLine();
        dfs(T);
        System.out.println(ans);
    }

    static void dfs(String string){
        if (S.length() == string.length()) {
            if (S.equals(string)){
                ans = 1;
                return;
            }
            return;
        }
        if (string.charAt(string.length() - 1) == 'A') {
            String substr = string.substring(0, string.length() - 1);
            dfs(substr);
        }
        if (string.charAt(0) == 'B') {
            String substr = string.substring(1, string.length());
            StringBuffer sb = new StringBuffer(substr);
            String reversed = sb.reverse().toString();
            dfs(reversed);
        }
        return;
    }
}


profile
꾸준히 공부하자

0개의 댓글