PS/LeetCode

[LeetCode] Rotate Array (JAVA)

제이온 (J.ON) 2021. 10. 19.

문제

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

 

입력 및 출력

 

제약 사항

 

풀이

투 포인터를 이용하여 해결할 수 있는 문제였습니다. 주어진 배열인 [1, 2, 3, 4, 5, 6, 7]과 k = 3인 예제를 들어 설명해 보겠습니다.

 

먼저 결과 값은 [5, 6, 7, 1, 2, 3, 4]가 될 것이며, 후반부에 [5, 6, 7]을 들고 맨 앞에 갖다 놓으면 될 것 같습니다. 상상으로는 쉽지만, 배열 내에서 요소를 조작해야 하니 생각보다 만만하지 않았습니다. 고심 끝에, 저는 아래와 같은 트릭을 사용하여 3번만큼 민 결과물인 [5, 6, 7, 1, 2, 3, 4]를 만들 수 있었습니다.

 

1. 기존 배열을 모두 역순으로 뒤집는다.

 

2. 0번째 인덱스부터 (k - 1)번째 인덱스까지 역순으로 뒤집는다.

 

3. k번째 인덱스부터 끝까지 역순으로 뒤집는다.

 

순서대로 수행해 보겠습니다. [1, 2, 3, 4, 5, 6, 7]은 [7, 6, 5, 4, 3, 2, 1]이 됩니다. 그리고 k = 3이므로 [7, 6, 5]를 역순으로 뒤집어서 [5, 6, 7, 4, 3, 2, 1]을 만듭니다. 마지막으로, [4, 3, 2, 1]을 역순으로 뒤집어서 [5, 6, 7, 1, 2, 3, 4]를 만들어낼 수 있습니다.

 

결국 핵심은 [5, 6, 7]을 어떻게 앞으로 옮길 것이냐인데, ArrayList같이 편하게 조작할 수 있는 형태도 아니므로 우선 역순으로 쭉 뒤집었습니다. 그렇게 하니 두 가지 영역으로 나뉘었습니다. [7, 6, 5], [4, 3, 2, 1]이 바로 그것이죠. 각각 역순으로 따로 뒤집어 주니 우리가 원하는 결과를 얻을 수 있었고, 어떤 형태도 성립합니다.

 

아래는 위 로직을 정리한 소스 코드입니다.

 

소스 코드

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
    
    private void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[end];
            nums[end] = nums[start];
            nums[start] = temp;
            start++;
            end--;
        }
    }
}

'PS > LeetCode' 카테고리의 다른 글

[LeetCode] Backspace String Compare (JAVA)  (0) 2021.11.10
[LeetCode] Reshape the Matrix (JAVA)  (0) 2021.11.08
[LeetCode] Add Binary (JAVA)  (0) 2021.11.02
[LeetCode] Move Zeroes (JAVA)  (0) 2021.10.20
[LeetCode] Squares of a Sorted Array (JAVA)  (0) 2021.10.19
[LeetCode] Rotate Array (JAVA)  (0) 2021.10.19

추천 글