SW Expert Academy 의 1228번 - 암호문1 문제입니다.
- 난이도 : 1~1.5
문제 조건
- 총 10개의 테스트 케이스가 주어진다.
- 한 개의 테스트 케이스 당 총 네 줄의 입력값이 존재한다.
- 첫번째 줄 : 원본 암호문 길이 N (10<=N<=20, N은 정수)
- 두번째 줄 : 원본 암호문
- 세번째 줄 : 명령어 갯수 (5<=N<=10, N은 정수)
- 네번째 줄 : 명령어 모음
- 0~999999 사이의 수를 나열해서 암호문을 만드는데, 네번째 줄의 삽입 명령어에 따라 원래의 암호문 중간 중간에 숫자를 삽입하여 암호문을 수정합니다.
- 원래 암호문을 list 자료구조에 담고, 명령어에 있는 숫자 리스트들을 원래 암호문 list에 삽입하면 되는 문제입니다.
Input
첫 줄에는 테스트 케이스 번호, 그 다음 네 줄에는 원본 암호문 길이, 원본 암호문, 명령어 갯수, 명령어 모음이 주어집니다.
Output
수정된 암호문의 처음 10개 항을 출력합니다.
생각한 아이디어
C++의 STL에 있는 list 자료구조를 사용하면 어렵지 않게 풀 수 있었습니다.
소스코드
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
#include <iostream>
#include <list>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, cnt, input;
int I, x, y;
char ch;
for (int T = 1; T <= 10; T++) {
cin >> N; cin.get(ch);
list<int> li;
for (int i = 0; i < N; i++) {
cin >> input;
li.push_back(input);
}
cin.get(ch); cin >> cnt; cin.get(ch);
list<int>::iterator iter; // 리스트에 저장된 원소 순회를 위한 반복자 선언
list<int> li2; // 추가로 삽입할 임시 리스트를 저장하기 위한 공간
for (int j = 0; j < cnt; j++) {
iter = li.begin();
cin >> ch;
cin >> x;
cin >> y;
for (int k = 0; k < y; k++) {
cin >> input;
li2.push_back(input);
}
for (int m = 0; m < x; m++)
iter++;
li.splice(iter, li2); // li 리스트의 iter가 가리키는 위치에 li2의 모든 원소 삽입
}
cout << "#" << T << " ";
iter = li.begin();
for (int n = 0; n < 10; n++) {
cout << *(iter++) << " ";
}
cout << "\n";
}
}