반응형
단순 작업 반복으로 풀려고 했는데 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; }
반응형