2019년 4월 13일 토요일

# CyclicRotation ( 현재 방법 구상중..)

역시나 코딜리티 레슨에 있는 문제.
주어진 배열이 3, 4, 5, 8 이라고 해보자. 이를 1번 회전 시키면 8, 3, 4, 5가 된다. 이는 오른쪽으로 1번 쉬프트 시킨 것 과 동일함.
따라서, 1번 회전은 곧 1번 오른쪽 시프트와 같다. ( 배열 인덱스를 넘어가는건 다시 처음 인덱스로 돌아온다. 위 예를 보면..)
라는 식의 문제이다. K번 회전했을 때 배열의 상태를 return 하는 함수를 주어주고 이를 구현하는건데, 우선 간단하게 생각해보면
오른쪽 쉬프트 동작을 K번 반복하면 된다. 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// this solution is BruteForce. 
vector<int> solution(vector<int> &A, int K){
 if(K==0) return A;
 
 vector<int> tmpArr;
 tmpArr.resize(A.size());
 for(int rShift = 0; rShift < K; rShift++){
  for(unsigned int idx = 0; idx < A.size(); idx++){
   if(idx == A.size()-1) tmpArr[0] = A[idx];
   else tmpArr[idx + 1] = A[idx];
  }
  A.assign(tmpArr.begin(), tmpArr.end());
 }
 return tmpArr;
}
일단 이 방법은 bruteForce나 다름없다. 임의의 공간이 필요하며, K * 원소 갯수만큼 반복해야 하며 또한 쉬프트 동작 1번마다 공간에 대한 재할당이 일어난다.
동작은 하지만 굉장히 비효율적인 구조다. 

댓글 없음:

댓글 쓰기