Game Develop

[Algorithm] Baekjoon 12904번 : A와 B 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 12904번 : A와 B

MaxLevel 2023. 3. 13. 23:57

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

 

12904번: A와 B

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

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    bool isReversedDirection = false
    deque<char> dq;
    string start;
    string target;
    int startSize = 0;
 
    cin >> start >> target;
    
    for (int i = 0; i < target.size(); ++i)
    {
        dq.push_back(target[i]);
    }
    startSize = start.size();
 
    while (1)
    {
        if (!isReversedDirection)
        {
            if (dq.back() == 'A')
            {
                dq.pop_back();
            }
            else
            {
                dq.pop_back();
                isReversedDirection = !isReversedDirection;
            }
        }
        else
        {
            if (dq.front() == 'A')
            {
                dq.pop_front();
            }
            else
            {
                dq.pop_front();
                isReversedDirection = !isReversedDirection;
            }
        }
 
        if (dq.size() == startSize)
        {
            break;
        }
    }
 
    if (!isReversedDirection)
    {
        for (int i = 0; i < startSize; ++i)
        {
            if (start[i] != dq[i])
            {
                cout << 0;
                return 0;
            }
        }
    }
    else
    {
        for (int i = 0; i < startSize; ++i)
        {
            if (start[i] != dq[startSize - i - 1])
            {
                cout << 0;
                return 0;
            }
        }
    }
 
    cout << 1;
}
cs

 

문제의 조건에 '추가'만 있을 뿐, '삭제'가 없기에 빠른속도내로 풀 수 있는문제.

그냥 얼추보면은 완전탐색마냥 풀어야 할 것 같지만, 삭제가 없기 때문에 target에서 연산을 역으로 적용하다가 크기가 start랑 같을 떄 비교해서 가능여부를 판단하면 된다. 사실상 루트가 한개다.

 

문제의 연산에는 뒤집는다...라는 동작이 있지만, reverse라는 동작자체가 O(n)이기 때문에, 보통 실제로 뒤집지는 않고 뒤집은것'처럼' 구현하는 경우가 많다. 따로 bool변수를 선언해서 현재 정방향인지 역방향인지를 표시해주면 된다.

역방향일 경우 문자열의 뒤에서 문자를 빼는게 아니라 앞에서 빼고, 정방향이면 뒤에서 문자를 빼주면 된다.