[js] 배열 회전시키기 (lv.0, 정답률 88%)

sookyoung.k·2024년 4월 21일
0
post-thumbnail

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

제한사항

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

☹️ 나의 풀이

function solution(numbers, direction) {
    if(direction === 'right') {
        let lastIndex = numbers.length - 1;
        numbers.unshift(numbers[lastIndex]);
        numbers.pop();
    } else if (direction === 'left') {
        numbers.push(numbers[0]);
        numbers.shift();
    }
    return numbers;
}

directionright일 때는 마지막 원소를 맨 앞으로 넣어주고, 마지막 원소를 삭제해준다.
left일 때는 첫 번째 원소를 마지막에 넣어준 후, 맨 앞의 원소를 삭제한다.

pop() - 배열 뒷부분의 값을 삭제
push() - 배열 뒷부분에 값을 삽입

shift() - 배열 앞부분의 값을 삭제
unshift() - 배열 앞부분에 값을 삽입

🫡 다른 풀이 1

function solution(numbers, direction) {
    var answer = [];

    if ("right" == direction) {
        numbers.unshift(numbers.pop());
    } else {
        numbers.push(numbers.shift());
    }

    answer = numbers;

    return answer;
}

변수 선언은 굳이 안 해도 될 것 같지만, 각각 조건을 한 줄로 줄일 수가 있구나 이거...!

사실 이해가 안 돼서 더 찾아봄. pop이 어떻게 unshift 안에 들어갈 수 있는 것임...?!

numbers.unshift(numbers.pop());
pop() 메서드는 배열의 마지막 요소를 제거하고 그 값을 반환한다.
그리고 unshift 메서드에서는 반환된 요소(numbers 배열에서 제거된 마지막 요소)를 배열의 밴 앞에 추가한다. 때문에 배열의 마지막 요소가 배열의 첫 번째 위치로 이동할 수 있게 된 것이다.

반대도 같은 원리!

🤗 다른 풀이 2

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

이런 식으로 메서드를 사용할 필요 없이 함수 내에서 쇼쇼쇽 움직일 수도 있군요

조건을 만족할 경우 numbers[numbers.length -1]을 통해서 배열의 마지막 요소를 추출한 후, ...numbers.slice(0, numbers.length - 1)]을 사용하여 나머지 요소를 추출하고 두 부분을 합친다.

배열 쓰는 건 연습이 많이 필요할 것 같다.

profile
영차영차 😎

0개의 댓글