๐Ÿ’ซ ETC/Leetcode

Week 1-1. [Array / String] 189. Rotate Array

ming412 2023. 8. 24. 15:59

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/rotate-array/?envType=study-plan-v2&envId=top-interview-150 

 

Rotate Array - LeetCode

Can you solve this real interview question? Rotate Array - Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.   Example 1: Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4] Explanation: rotate 1 step

leetcode.com

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ k ๋งŒํผ rotate ํ•˜๋ผ.
  • ์ž…๋ ฅ
    • nums | int arrray := ์ •์ˆ˜ ๋ฐฐ์—ด, | nums | ∈ [1, 10^5]
  • ์ถœ๋ ฅ
    • nums | int arrray := rotate ๋œ ๋ฐฐ์—ด, | nums | ∈ [1, 10^5]
  • ์กฐ๊ฑด
    • | nums[i] | ∈ [-2^31, 2^31 - 1]
    • | k | ∈ [0, 10^5]

 

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

์ถ”๊ฐ€ Array ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ๋‹ค.

 

์šฐ์„  nums ๋ฐฐ์—ด์˜ ๊ฐ’์„ copied ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•ด๋‘”๋‹ค.

k๋งŒํผ rotate ํ•œ ์ธ๋ฑ์Šค(=idx)๋ฅผ ๊ตฌํ•œ ๋’ค, nums[idx]์— copied ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค. 

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

nums์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 100,000์ด๋ฏ€๋กœ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ๋‹จ์ผ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

n = nums ๋ฐฐ์—ด ๊ธธ์ด
copied = nums๋ฅผ ๋ณต์‚ฌํ•œ ๋ฐฐ์—ด

for (0๋ถ€ํ„ฐ; n๊นŒ์ง€; 1์”ฉ ์ฆ๊ฐ€) {
	idx = (i + k) % n
    nums[idx]์— copied[i] ๋Œ€์ž…
}

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] copied = new int[n];
        
        for (int i=0; i<n; i++) {
            copied[i] = nums[i];
        }

        for (int i=0; i<n; i++) {
            int idx = (i+k) % n;
            nums[idx] = copied[i];
        }
    }
}

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

N์€ ์ตœ๋Œ€ 100,000์ด๋ฏ€๋กœ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ด๋‹ค.

 

๋ณดํ†ต 1์ดˆ ์ œํ•œ์ด๋ผ๊ณ  ํ•  ๋•Œ, O(N)์€ ์•ฝ 1์–ต๊นŒ์ง€ O(N^2)์€ ์•ฝ 1๋งŒ๊นŒ์ง€ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ 2์ค‘ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ํ„ฐ์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

copied ๋ฐฐ์—ด์— ๊ฐ’์„ ๋ณต์‚ฌํ•  ๋•Œ, ์œ„์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ for๋ฌธ์„ ์ด์šฉํ•ด ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๋Œ€์ž…ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ Arrays.copyOf() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ๊ฐ™์€ ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

int n = nums.length;
int[] copied = Arrays.copyOf(nums, n); // ์›๋ณธ ๋ฐฐ์—ด, ๋ณต์‚ฌํ•  ๊ธธ์ด

 

 

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ nums์˜ ๊ธธ์ด(= n)๊ฐ€ 5๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์ด ๋•Œ 1 ๋งŒํผ rotate ํ•˜๋Š” ๊ฒƒ๊ณผ 6๋งŒํผ rotate ํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

๋ฌธ์ œ์—์„œ k๊ฐ€ ์ตœ๋Œ€ 100,000 ์ด๋‹ˆ k %= n ์œผ๋กœ k์˜ ๊ฐ’์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ๋„ ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

class Solution {
    public void rotate(int[] nums, int k) {

        int len = nums.length;
        k %= len;

        reverse(nums, 0, len - 1); // step1. ์ „์ฒด reverse [7,6,5,4,3,2,1]
        reverse(nums, 0, k - 1);   // step2. 0๋ถ€ํ„ฐ k-1๊นŒ์ง€ reverse [ 5,6,7,4,3,2,1 ]
        reverse(nums, k, len - 1); // step3. k๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ reverse [ 5,6,7,1,2,3,4 ]
    }

    public void reverse(int[] nums, int start, int end){
        while (start < end){
            // ์–‘ ๋ ์›์†Œ swap ๊ณผ์ • ๋ฐ˜๋ณต
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            
            start++;
            end--;
        }
    }
}

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

while๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

๋А๋‚€ ์ 

k %= len ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๊ณผ์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๊ผผ๊ผผํžˆ ์ฐพ๋Š” ์—ฐ์Šต์„ ํ•ด์•ผ๊ฒ ๋‹ค.