Posts 알고리즘 - 1225. [S/W 문제해결 기본] 암호생성기
Post
Cancel

알고리즘 - 1225. [S/W 문제해결 기본] 암호생성기

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와 함께 사용하면 안 됩니다. [출처 링크 : (클릭)]

알고리즘 - BFS(너비 우선 탐색)

알고리즘 - 1226. [S/W 문제해결 기본] 미로찾기 문제(1)