drop-of-water

문제 링크

조건

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

입력값

  • nums = 그냥 배열
  • k = 회전할 횟 수

출력값

  • 없음, nums 배열 요소의 위치들만 바꾸면됨

풀이과정

  • 처음에 nums.length <= 10^5 조건을 보지 않고 2중 루프로 구현해 time limit exceeded 에러가 발생했다 (다음부터는 조건 부분을 먼저 확인하자)
  • 시간을 줄이기 위해 nums 배열을 복사한 후 해당 배열의 요소 값을 가져오는 방법을 사용했다
  • k를 nums의 길이와 나눈 나머지 값을 사용해 k가 nums.length보다 클때 제자리로 rotate 되는 부분을 제거한다
  • 배열 뒷 요소부터 바꾸는 전략을 취했는데 어차피 복사한 배열에서 값을 가져오는 거라 순서는 상관 없었을듯 하다
  • 아무튼 뒷 요소부터 i-k로 rotate 후 위치될 값을 가져오는데 i-k가 0 보다 작은 경우 배열의 길이 + (i-k) 값을 해줌으로써 nums[-1] 와 같이 음수의 값을 idx로 사용할 수 있게했다

코드

var rotate = function (nums, k) {
  // 시간을 줄이기 위해 nums 배열을 복사한 후 해당 배열의 요소 값을 가져오는 방법을 사용했다
  let copied = [...nums];

  // k를 nums의 길이와 나눈 나머지 값을 사용해 k가 nums.length보다 클때 제자리로 rotate 되는 부분을 제거한다
  k = k % nums.length;

  for (let i = nums.length - 1; i >= 0; i--) {
    // 뒷 요소부터 i-k로 rotate 후 위치될 값을 가져오는데 i-k가 0 보다 작은 경우 배열의 길이 + (i-k) 값을 해줌으로써 nums[-1] 와 같이 음수의 값을 idx로 사용할 수 있게했다
    let idx = i - k < 0 ? nums.length + i - k : i - k;
    nums[i] = copied[idx];
  }
};

😊