SWExpertAcademy의 암호문(1228 / 1229 / 1230) 이다.

이 글에서는 회문 시리즈 [ 암호문1(1228) / 암호문2(1229) / 암호문3(1230) ] 의 풀이가 너무 비슷해서

3 문제의 풀이를 한번에 적어보고자 한다.


[ 문제풀이 ]

1) 먼저, 3문제 모두 본인은 STL에서 제공하는 'list'를 이용해서 풀어보았다.

   list가 자주 사용되는 것은 아니지만, 알아두면 좋으니 본인이 이 문제를 해결해서 사용한 함수들 몇 가지만 먼저

   알아보고 들어가자.

   - list.push_back(a)

     - 가장 뒤에 원소 'a'를 추가하는 함수이다.

   - list.splice(Iter, Iter2)

     - Iter이 가르키는 곳에, Iter2의 모든 원소를 추가한다.

   - list.erase(Start, End)

     - Start ~ End 사이에 있는 모든 원소들을 삭제한다.

   본인은 이 3가지 함수를 이용해서 이 문제를 해결했다. 그렇다면 위의 함수들을 어떻게 활용했는지 알아보자.


2) 암호문1, 2, 3 에서 주어지는 원본 암호문의 길이를 하나의 List라고 생각해보자.

   그렇다면, 이 문제들에서는 List의 '중간삽입'과 '중간삭제' 만 간편하게 할 수 있다면 쉽게 해결할 수 있을 것이다.

   본인이 위해서 설명한 'splice' 함수와 'erase' 함수가 중간삽입과 중간삭제를 나타내는 함수들이다.

   조금 더 구체적으로 설명해보면, splice(Iter, Iter2) 함수는 '반복자 Iter' 가 가르키는 곳에서 부터 '반복자 Iter2' 가

   가르키는 모든 원소들을 삽입하게 된다.

   여기서 반복자 Iterator을 사용해주어야 하는데, 선언 하는 법은 list<int>::iterator 변수명 으로 선언을

   해주면 된다. 단순히 몇 번 인덱스인지를 나타내는 정수 값이 아닌, 내부의 원소를 직접 가르키고 있는 포인터 연산자

   라고 생각하면 된다. (깊게 모르셔도 문제 푸는데는 지장이 없습니다 !)

   따라서 '원본 암호문을 저장한 List.splice(삽입할 암호문이 들어갈 위치를 가르키는 Iterator , 암호문을 가르키는 Iterator)'

   로 구현을 하면, 문제에서 요구하는 대로 중간삽입이 가능하다.

   erase같은 경우에는 [ Start ~ End ) 에 있는 모든 원소들을 삭제하는 함수이다.

   따라서 '원본 암호문을 저장한 List.erase(삭제할 첫 암호문이 있는 위치를 카르키는 Iterator, 삭제할 마지막 암호문이

   있는 위치를 가르키는 Iterator) 로 구현을 하면 중간삭제가 가능하다.


[ 소스코드1 (암호문1 / 1228) ]

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
#include<iostream>
#include<list>
 
#define endl "\n"
using namespace std;
 
int Orig_N;
int PW_N;
 
list<int> List;
 
void Initialize()
{
    List.clear();
}
 
void Input()
{
    cin >> Orig_N;
    for (int i = 0; i < Orig_N; i++)
    {
        int a; cin >> a;
        List.push_back(a);
    }
    cin >> PW_N;
    for (int i = 0; i < PW_N; i++)
    {
        char C; cin >> C;
        int Pos; cin >> Pos;
        int N; cin >> N;
        list<int> PW;
 
        for (int j = 0; j < N; j++)
        {
            int a; cin >> a;
            PW.push_back(a);
        }
 
        list<int>::iterator Iter = List.begin();
        for (int i = 0; i < Pos; i++) Iter++;
        List.splice(Iter, PW);
    }
}
 
void Solve()
{
    int Tc = 10;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
 
        cout << "#" << T << " ";
        for (int i = 0; i < 10; i++)
        {
            cout << List.front() << " ";
            List.pop_front();
        }
        cout << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
 
cs


[ 소스코드2 (암호문2 / 1229) ]

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
#include<iostream>
#include<list>
 
#define endl "\n"
using namespace std;
 
int Orig_N;
int PW_N;
 
list<int> List;
 
void Initialize()
{
    List.clear();
}
 
void Input()
{
    cin >> Orig_N;
    for (int i = 0; i < Orig_N; i++)
    {
        int a; cin >> a;
        List.push_back(a);
    }
    cin >> PW_N;
    for (int i = 0; i < PW_N; i++)
    {
        char C; cin >> C;
        if (C == 'I')
        {
            int Pos; cin >> Pos;
            int N; cin >> N;
            list<int> PW;
 
            for (int j = 0; j < N; j++)
            {
                int a; cin >> a;
                PW.push_back(a);
            }
 
            list<int>::iterator Iter = List.begin();
            for (int i = 0; i < Pos; i++) Iter++;
            List.splice(Iter, PW);
        }
        else
        {
            int Pos; cin >> Pos;
            int N; cin >> N;
            list<int>::iterator Start = List.begin();
            list<int>::iterator End;
            for (int i = 0; i < Pos; i++) Start++;
            End = Start;
            for (int i = 0; i < N; i++) End++;
            List.erase(Start, End);
        }
    }
}
 
void Solve()
{
    int Tc = 10;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
 
        cout << "#" << T << " ";
        for (int i = 0; i < 10; i++)
        {
            cout << List.front() << " ";
            List.pop_front();
        }
        cout << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
 
cs


[ 소스코드3 (암호문3 / 1230) ]

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
#include<iostream>
#include<list>
 
#define endl "\n"
using namespace std;
 
int Orig_N;
int PW_N;
 
list<int> List;
 
void Initialize()
{
    List.clear();
}
 
void Input()
{
    cin >> Orig_N;
    for (int i = 0; i < Orig_N; i++)
    {
        int a; cin >> a;
        List.push_back(a);
    }
    cin >> PW_N;
    for (int i = 0; i < PW_N; i++)
    {
        char C; cin >> C;
        if (C == 'I')
        {
            int Pos; cin >> Pos;
            int N; cin >> N;
            list<int> PW;
 
            for (int j = 0; j < N; j++)
            {
                int a; cin >> a;
                PW.push_back(a);
            }
 
            list<int>::iterator Iter = List.begin();
            for (int i = 0; i < Pos; i++) Iter++;
            List.splice(Iter, PW);
        }
        else if(C == 'D')
        {
            int Pos; cin >> Pos;
            int N; cin >> N;
            list<int>::iterator Start = List.begin();
            list<int>::iterator End;
            for (int i = 0; i < Pos; i++) Start++;
            End = Start;
            for (int i = 0; i < N; i++) End++;
            List.erase(Start, End);
        }
        else
        {
            int Cnt; cin >> Cnt;
            for (int i = 0; i < Cnt; i++)
            {
                int a; cin >> a;
                List.push_back(a);
            }
        }
    }
}
 
void Solve()
{
    int Tc = 10;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
 
        cout << "#" << T << " ";
        for (int i = 0; i < 10; i++)
        {
            cout << List.front() << " ";
            List.pop_front();
        }
        cout << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
 
cs














+ Recent posts