본문 바로가기
SWE/코테

[SW Expert Academy] '10' #1225 암호 생성기 X

by S나라라2 2019. 3. 14.
반응형

단순 작업 반복으로 풀려고 했는데 test case에서 주어진 숫자가 컸다.


그래서 몇 회 돌면 반복되는지 규칙성을 찾았다.


=> 8 cycle돌면 숫자의 순서가 처음 순서와 같아지고, 감소되는 값도 모두 -15으로 같다는 걸 확인할 수 있다.

즉, 입력받은 값이 15이상이면 모두 15의 배수를 빼고 시뮬레이션하면서 결과값을 알 수 있다.


// #1225  암호생성기
#include < iostream >
#include < string >   //cin >> str
#include < cstring >  //memset

using namespace std;

int main(void) {
    int arr[8];
    
    for(int tc=1; tc <= 10; tc++){
        // 입력받기
        cin>>tc;
        int minimum = 987654321; // 가장 작은 몫 찾기
        for(int i=0; i < 8; i++){
            cin >> arr[i];
            int temp = arr[i]/15;
            if(temp < minimum) minimum = temp;
        }
        
        // 15배수 값 빼주기
        minimum = minimum*15;
        for(int i=0; i < 8; i++) {
            arr[i] -= minimum;
            if(arr[i] <= 0 ){
                for(int k=0; k <= i; k++){
                    arr[k]+=15;
                }
                minimum -= 15;
            }
        }
        // 연산
        int idx = 0;
        int num =1;
        while(1){
            // 탈출 조건
            if(arr[idx]-num <= 0){
                arr[idx] = 0;
                idx = (idx+1)%8;
                break;
            }
            arr[idx] -= num;
            idx = (idx+1)%8;
            num++;
            if(num > 5) num=1;
        }
        
        // 출력
        cout << '#' << tc << ' ';
        for(int k=0; k < 8; k++){
            cout << arr[idx] <<' ';
            idx = (idx+1)%8;
        }
        cout << endl;
    }
    return 0;
}
반응형