반응형



문제 출처 :

 

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


알고리즘 분석 :


문제 해결에 필요한 사항

1. 스택의 활용

2. 문자 처리


이 문제는 처음 보면 strstr처럼 문자열 검색으로 코딩을 짜 볼 수 있다.


하지만, 그렇게 짠다면 문자열의 위치가 계속 변하고, ( cc44처럼 다시 이전으로 돌아가야될 상황들이 발생 ) 이렇게 계속 진행되다보면


시간 복잡도에서 밀릴 수 있다.  


따라서 스택을 이용하여 코드를 완성한다.


스택의 설명은 다음과 같다.

S :: 처음 스택에 push될 스택이며, 값을 조사할 때 이용된다.

S2 :: 정답을 비교할때 잠시 넣어두는 임시 스택이다.

String :: 최종 정답을 출력할 때 이용하는 스택이다.


이 코드는 주석을 풀어 실행 해 본다면 이해가 쉬울 것이다.




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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <stack>
#include <string.h>
 
using namespace std;
 
char arr[1000001];
 
 
int main()
{
    stack <char> S;
    stack <char> S2;
    stack <char> String;
 
    char ans[40];
 
    scanf("%s", arr);
    scanf("%s", ans);
 
    int len = strlen(arr);
    int len2 = strlen(ans);
    int tmp = len2 - 1;
    int success = 0;
 
    for (int i = 0; i < len; i++)
    {
        S.push(arr[i]);
        while (S.empty() != 1)
        {
            if (S.top() == ans[tmp] && S.size() >= tmp)
            {
                S2.push(S.top());
                // cout <<  " 스택 값 넣는중 :: " << S.top() << endl;
                S.pop();
                tmp--;
 
                success++;
                if (tmp == -&& S2.size() == len2)
                {
                    while (S2.empty() != 1)
                    {
                        // cout << "임시 스택초기화 :: " << S2.top() << endl;
                        S2.pop();
                    }
                    tmp = len2 - 1;
                }                
            }
 
            else
            {
                while (success != && S2.empty() != 1)
                {
                    // cout << "다시 스택에 push :: "  << S2.top()  << endl;
                    S.push(S2.top());
                    S2.pop();
                    success--;
                }
                tmp = len2 - 1;
                break;
            }
 
        }
 
        while (S2.empty() != 1)
        {
            //cout << "처리되지 못한 값 push :: " << S2.top() << endl;
            S.push(S2.top());
            S2.pop();
            tmp = len2 - 1;
        }
 
 
 
    }
 
    // 스택에 남은것이 없을 때 출력
    if (S.empty() == 1)
        cout << "FRULA";
 
    // 스택에 남아있을 때 정답 출력을 위해 스택 뒤집어 담는 과정
    while (S.empty() != 1)
    {
        String.push(S.top());
        S.pop();
    }
 
    // 정답이 담긴 스택 출력
    while (String.empty() != 1)
    {
        cout << String.top();
        String.pop();
    }
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus























반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[2355번] 시그마  (0) 2016.09.05
[11944번] NN  (0) 2016.09.05
[2846번] 오르막길  (0) 2016.08.30
[1350번] 진짜 공간  (0) 2016.08.30
[11650번] 좌표 정렬하기  (0) 2016.08.22