본문 바로가기

algorithm

백준 12904 - A와 B (greedy)

728x90

문제 : 12904번: A와 B (acmicpc.net)

 

12904번: A와 B

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

www.acmicpc.net

 

풀이과정

문자열 S를 2가지 규칙에 의해 T로 바꿀 수 있는지 물어보는 문제였습니다.

 

만약 S -> T로 변환하려고 한다면 최악의 경우 2^N만큼의 반복이 필요하기 때문에

시간복잡도가 O(2^N) 이 되어서 시간 내에 풀기 어렵습니다.

 

그러나 역방향으로 T -> S로 변환한다고 하면

1) 마지막 문자가 A인 경우 A를 삭제

2) 마지막 문자가 B인 경우 B를 삭제하고 reverse

2가지 과정이 정해지기 때문에 시간복잡도가 O(N)이 됩니다.

 

기저사례로 S와 T의 길이가 같아졌을 때 문자가 같은지 비교하면 해결할 수 있었습니다.

코드

#include <iostream>
#include <vector>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
string S,T;

/*
    길이가 긴 문자열 -> 짧은 문자열로 변환하는 과정은 O(n) 의 시간복잡도가 걸린다
    반면 짧은 -> 긴 문자열 변환은 O(2^n)의 지수함수 시간복잡도가 걸린다
*/

int solution() {
    while(1) {
        // 기저사례
        if(S.length() == T.length()) {
            if(S == T) return 1;
            else return 0;
        }

        // 맨 뒤가 A인경우 제거
        if(T.back() == 'A')
            T.pop_back();
        // B인경우 제거하고 뒤집기
        else if(T.back() == 'B') {
            T.pop_back();
            reverse(T.begin(),T.end());
        }
    }
}
int main()
{

    cin >> S;
    cin >> T;
    printf("%d\n",solution());
}
728x90

'algorithm' 카테고리의 다른 글

백준 2109 순회 강연 ( greedy )  (0) 2021.09.25
백준 2457-공주님의 정원 (greedy)  (0) 2021.09.05
백준 10775 공항 (union-find algorithm)  (0) 2021.08.25
백준 3109 빵집 (greedy, dfs)  (0) 2021.08.25
백준 1202 - 보석 도둑  (0) 2021.08.18