189. Rotate Array

Created
Sep 16, 2023 12:17 AM
Modified
Last updated December 7, 2023
Tag
Leet Code
Medium
  • μ§€μ •λœ 숫자(k)만큼 arrayλ₯Ό 였λ₯Έμͺ½μœΌλ‘œ νšŒμ „ μ‹œν‚€λ©΄ λ˜λŠ” 문제.
  • k 값이 0μ΄κ±°λ‚˜ N의 배수인 경우 νšŒμ „ν•  ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ edge case둜 μ²˜λ¦¬ν•œλ‹€.
  • in-place둜 ν•΄κ²°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λ©΄ 사싀 arrayλ₯Ό ν•˜λ‚˜ 더 ν• λ‹Ήν•΄μ„œ νšŒμ „ μ‹œν‚¨ index λ§ˆλ‹€ λ„£μ–΄μ£Όλ©΄ κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°λœλ‹€.
  • in-place둜 ν•˜λŠ” 것이 μ’€ ν—·κ°ˆλ ΈλŠ”λ° λ‹€μŒκ³Ό 같이 ν•΄κ²°ν–ˆλ‹€.
    • (1) 첫번째 elementλ₯Ό 이동 μ‹œμΌœμ•Ό 될 element(prev)둜 μ €μž₯ν•œλ‹€.
    • (2) λ‹€μŒ 이동 μœ„μΉ˜μ˜ elementλ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜κ³  prevλ₯Ό λ‹€μŒ 이동 μœ„μΉ˜λ‘œ μ΄λ™ν•œλ‹€.
    • (3) μž„μ‹œ μ €μž₯ν•œ elementλ₯Ό λ‹€μŒ 이동 μ‹œμΌœμ•Ό 될 element(prev)둜 μ €μž₯ν•œλ‹€.
    • (4) (2) ~ (3) 과정을 element 개수만큼 λ°˜λ³΅ν•œλ‹€.
    • λ¬Έμ œλŠ” μ΄λ ‡κ²Œ λ°˜λ³΅ν•˜λ‹€λ³΄λ©΄ κ²½μš°μ— λ”°λΌμ„œλŠ” μ‹œμž‘μ μœΌλ‘œ λŒμ•„μ˜€λŠ” κ²½μš°κ°€ μžˆλ‹€.
      • 예λ₯Ό λ“€μ–΄ |nums| = 6, k = 4 인 경우λ₯Ό 생각해보면 이동 μ‹œμΌœμ•Όλ  element의 indexλŠ” 0 β†’ 4 β†’ 2 β†’ 0으둜 λ˜λŒμ•„ 였게 λœλ‹€.
    • λ”°λΌμ„œ μ‹œμž‘μ μ„ μ €μž₯ (base) 해두고 μ‹œμž‘μ μœΌλ‘œ λŒμ•„μ˜¬ 경우 λ°”λ‘œ κ·Έ λ‹€μŒ μœ„μΉ˜ (+1)λ₯Ό μƒˆλ‘œμš΄ μ‹œμž‘μ μœΌλ‘œ ν•œλ‹€. 그리고 (2)~(3)의 과정을 λ˜‘κ°™μ΄ λ°˜λ³΅ν•˜λ©΄ λœλ‹€.
class Solution { public: void rotate(vector<int>& nums, int k) { int N = nums.size(); if (k % N == 0) return; int prev = nums[0]; int i = k % N; int base = 0; int count = 0; while (count++ < N) { int temp = nums[i]; nums[i] = prev; prev = temp; if (i == base) { i = ++base; prev = nums[i]; } i = (i + k) % N; } } };