본문 바로가기

짜잘한 기록

백준 12904 A와 B

조금 간단한 구현 문제이다. 두 스트링을 받아, 첫 스트링에서 두 가지 연산을 통해 두번째 스트링이 만들어 질 수 있는지 확인하는 문제이다. 여기서, 두 연산이 모두 뒤에 각각 서로 다른 문자를 붙인다는 것에 주목하자. 만들어진(혹은 만들고 있는 과정의) 스트링의 끝을 확인하면, 이 전에 일어났던 연산이 무엇인지 바로 알 수 있다.

그러면, 우리는 원래 스트링에서 반대로 연산을 해 나가 찾고자 하는 스트링이 만들어지는지 확인을 하면 된다.

구현은 진짜 몇줄 안되는 간단한 코드였다. 두 스트링 입력을 받고, T의 뒤 자리를 확인해서 A이면 단순히 해당 문자를 삭제 했고, B이면 삭제 후 스트링을 뒤집어 줬다. 

T의 길이가 한 루프마나 하나씩 줄어들기에, T의 길이가 0이 될때까지 루프를 돌았다. 문제 조건에서 빈 문자열이 입력으로 들어오지 않는다고 했기에, T가 0이 될때까지 S와 매치가 되지 않는다면, 만들 수 없는 상황이다. 각 루프마다 T와 비교해 만들어졌으면 1을 출력하고 종료, 루프가 끝날때까지 만들어지지 않으면 루프를 나와 0을 출력하고 종료된다.


#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string S;
    std::string T;
    std::cin >> S >> T;

    while (T.size())
    {
        if (T == S)
        {
            std::cout << 1;
            return 0;
        }
        if (T.back() == 'B')
        {
            T.erase(T.end() - 1);
            std::reverse(T.begin(), T.end());
        }
        else if (T.back() == 'A')
        {
            T.erase(T.end() - 1);
        }
    }
    std::cout << 0;
    return 0;
}

 

아 이렇게 짧은 코드를 올리는 건 처음인 것 같다. 아이 부끄러... 그래도 한번 생각해서 주르르륵 짠 코드가 한번에 맞았습니다 뜨는건 기분이 좋네요... 골드 5 문제이긴 한데, 다른 골드 5 문제보단 쉬운 것 같다. 하핳.

 

오늘도 평온한 하루가 되길. 슨민.

'짜잘한 기록' 카테고리의 다른 글

백준 2470 두 용액  (0) 2021.11.17
백준 1112 진법 변환  (0) 2021.11.11
백준 2636 치즈  (0) 2021.11.08
[문을 편하게 열고 싶다] UID changable tag에 카드 복사하기(완)  (0) 2021.11.04
백준 15683 감시  (0) 2021.11.03