Coding Test/LeetCode

[LeetCode] 189. Rotate Array c++

owls 2022. 12. 23. 15:10
728x90
  • 문제

Given an array, rotate the array to the right by k steps, where k is non-negative.

Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

 

  • 문제 해결

rotate는 맨 뒤 원소가 맨 앞원소로 이동된다. 

k 개수 만큼 nums맨뒤의 원소가 맨앞으로 rotate된다. 

회전한 원소들이 기존 순서를 유지하여 rotate되는 것을 보고 생각해낸 구현 방식이다.

nums의 뒤에서 부터 k개를 맨 앞으로 rotate시키고 나머지 원소들은 뒤로 이동시킨다.

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(k > nums.size()){
            k = k % nums.size();
        }
        
        if(k == nums.size()){
            return;
        }
        
        int l = nums.size() - k;
        vector<int> result(nums.begin()+l, nums.end());
        for(int i = 0; i < l; i++){
            result.push_back(nums[i]);
        }
        nums.clear();
        nums = result;
    }
};

 

 

다른 방법

class Solution {
    public :
    void reverse(vector<int>& nums, int i, int j){
        int li = i; // left;
        int ri = j;
        
        while(li < ri){
            int temp = nums[li];
            nums[li] = nums[ri];
            nums[ri] = temp;
            
            li++;
            ri--;
        }
    }
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();
        if(k < 0){ 
            k += nums.size();
        }
        reverse(nums, 0, nums.size() - k - 1);
        reverse(nums, nums.size() - k, nums.size() - 1);
        reverse(nums, 0, nums.size() - 1);
    }
};

배열의 뒤에서 K개수 만큼 P2그룹, 나머지 P1그룹으로 나눈다.

P1 , P2 그룹에서 자리를 위의 규칙대로 rotate한다.

결과를 reverse하면 구하고자 하는 답을 도출할 수 있다.

 

728x90