[프로그래머스] 배열 회전시키기


문제 설명

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 “left” 와 “right” 둘 중 하나입니다.

입출력 예

numbersdirectionresult
[1, 2, 3]“right”[3, 1, 2]
[4, 455, 6, 4, -1, 45, 6]“left”[455, 6, 4, -1, 45, 6, 4]

입출력 예 설명

입출력 예 #1

  • numbers 가 [1, 2, 3]이고 direction이 “right” 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.

입출력 예 #2

  • numbers 가 [4, 455, 6, 4, -1, 45, 6]이고 direction이 “left” 이므로 왼쪽으로 한 칸씩 회전시킨 [455, 6, 4, -1, 45, 6, 4]를 return합니다.

나의 풀이

function solution(numbers, direction) {
  switch (direction) {
    case "right":
      numbers.unshift(numbers.pop());
      return numbers;
      break;
    case "left":
      numbers.push(numbers.shift());
      return numbers;
  }
}

나의 두번째 풀이(Code Refactoring)

function solution(numbers, direction) {
  return direction === "right"
    ? [numbers[numbers.length - 1], ...numbers.slice(0, numbers.length - 1)]
    : [...numbers.slice(1), numbers[0]];
}

// 배열 요소의 0번째 인덱스와 마지막 인덱스만 사용하여 문제 해결
// direction이 right면 마지막 요소의 인덱스부터 전체요소를 얕은 복사로 반환시킨다
// 그렇지 않으면 인덱스의 첫번째 요소를 numbers에 얕은 복사로 반환

참고 할 만한 다른 사람의 코드

function solution(numbers, direction) {
  const result = [];

  if (direction == "right") {
    result[0] = numbers[numbers.length - 1];

    for (let i = 0; i < numbers.length - 1; i++) {
      result.push(numbers[i]);
    }
  } else {
    lastNumber = numbers[0];

    for (let i = 0; i < numbers.length - 1; i++) {
      result.push(numbers[i + 1]);
    }

    result.push(lastNumber);
  }

  return result;
}

// 반복 연산으로 바꾸는 방법