본문 바로가기
C++ 알고리즘

1225. [S/W 문제해결 기본] 7일차 - 암호생성기 D3

by hoshi03 2024. 10. 27.

다음 주어진 조건에 따라 n개의 수를 처리하면 8자리의 암호를 생성할 수 있다.

- 8개의 숫자를 입력 받는다.

- 첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다. 

다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다.

이와 같은 작업을 한 사이클이라 한다.

- 숫자가 감소할 때 0보다 작아지는 경우 0으로 유지되며, 프로그램은 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.

 

[1 사이클]

 
 
[암호 도출]
 
[제약 사항]

주어지는 각 수는 integer 범위를 넘지 않는다.

마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.

 
[입력]

총 10개의 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고, 그 다음 줄에는 8개의 데이터가 주어진다.
 
[출력]

#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.
입력1
9550 9556 9550 9553 9558 9551 9551 9551
2
2419 2418 2423 2415 2422 2419 2420 2415
........
 
출력#1 6 2 2 9 4 1 3 0
#2 9 7 9 5 4 3 8 0
.......

 

풀이

 

맨 앞에꺼 계산하고 맨 뒤로 보내는 로직을 반복

큐나 덱을 이용하는 문제 같아서 덱으로 풀었다

첨엔 8개 입력받고 1~8 빼는게 사이클인줄 알았는데 1~5까지 였다..

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <deque>

using namespace std;

int main() {

	for (int t = 1; t <= 10; t++) {
		int n; cin >> n;
		deque<int> dq(8);
		for (int i = 0; i < 8; i++) cin >> dq[i];

		bool isComplete = false;

		while (!isComplete)
		{
			for (int i = 1; i <= 5; i++) {
				int tmp = dq.front();
				dq.pop_front();
				if (tmp - i <= 0) {
					dq.push_back(0);
					isComplete = true;
					break;
				}

				else dq.push_back(tmp - i);
			}
		}

		cout << "#" << n << " ";
		for (int i = 0; i < 8; i++) cout << dq[i] << " ";
		cout << '\n';
	}
	return 0;
}