SW Expert Academy 의 1225번 - 암호생성기 문제입니다.
C++의 STL 라이브러리인 queue를 사용하거나, C로 직접 queue를 구현해서 코딩하는 등으로
문제를 풀면 될 것 같습니다.
- 난이도 : 1~2
문제 조건
- 총 10개의 테스트 케이스가 주어진다.
- 한 개의 테스트 케이스 당, 8개의 숫자를 입력받는다.
- 각각을 차례대로 첫 번째 수부터 여덟번째 수라고 할 때,
- 맨 처음 숫자를 1 감소시키고 맨 뒤로 이동
- 다시 맨 처음 숫자를 2 감소시키고 맨 뒤로 이동
- … (반복)
- 맨 처음 숫자를 5 감소시키고 맨 뒤로 이동 - 여기까지 한 사이클
- 다시 맨 처음 숫자를 1 감소시키고 맨 뒤로 이동
- 맨 처음 숫자를 2 감소시키고 맨 뒤로 이동
- 맨 처음 숫자를 3 감소시키고 맨 뒤로 이동
- …(반복)
- 감소시킬 때 0보다 작거나 같아지면, 0을 맨 뒤로 보내고 사이클 중지 및 출력
Input
첫 줄에는 테스트 케이스 번호, 그 다음 줄에는 인풋값 8개가 주어진다.
Output
생성된 암호를 출력한다.
처음에 생각한 아이디어
복잡한 알고리즘이 들어가 있지 않는 문제라고 생각했습니다.
8개의 숫자가 나열되어 있고, 맨 앞의 것을 뒤로 이동시키는 일련의 과정은 큐 자료구조를 이용하면 가장 간편할 것입니다.
소스코드
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
#include <iostream>
#include <queue>
using namespace std;
int main() {
int input, f_data, sub_C, cycle, test_case;
queue<int> q;
cin.tie(NULL); // cin의 실행시간을 감소시켜 줌
for (int T = 1; T <= 10; T++) {
cin >> test_case;
for (int i = 0; i < 8; i++) {
cin >> input;
q.push(input);
}
sub_C = 1;
cycle = 1;
while (1) {
f_data = q.front();
f_data -= sub_C;
q.pop();
if (f_data <= 0) {
q.push(0);
break;
}
q.push(f_data);
if (cycle >= 5) {
sub_C = 0;
cycle = 0;
}
sub_C += 1;
cycle++;
}
// print
cout << "#" << T << " ";
for (int j = 0; j < 8; j++) {
cout << q.front() << " ";
q.pop();
}
cout << "\n";
}
}
c++의 STL에서 제공하는 queue 자료구조를 이용하였습니다.
※ c++에서 cin으로 입력받기 전에, cin.tie(NULL); 을 선언하고 나서 입력받으면 실행시간이 줄어드는 효과를 얻을 수 있습니다.
※ 그러나 위와 같은 방법은 주의해서 사용하여야 한다고 합니다. 실무에서는 사용하지 말고, 싱글 쓰레드 환경에서만 사용하도록 합니다. 또한 scanf, printf와 함께 사용하면 안 됩니다. [출처 링크 : (클릭)]