다음 주어진 조건에 따라 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
........
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
.......
#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;
}
'C++ 알고리즘' 카테고리의 다른 글
1289. 원재의 메모리 복구하기 D3 (0) | 2024.10.27 |
---|---|
1215. [S/W 문제해결 기본] 3일차 - 회문1 D3 (1) | 2024.10.27 |
2805. 농작물 수확하기 D3 (0) | 2024.10.27 |
1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드 D3 (0) | 2024.10.26 |
1208. [S/W 문제해결 기본] 1일차 - Flatten D3 (1) | 2024.10.15 |