정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
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;
}
direction
이 right
일 때는 마지막 원소를 맨 앞으로 넣어주고, 마지막 원소를 삭제해준다.
left
일 때는 첫 번째 원소를 마지막에 넣어준 후, 맨 앞의 원소를 삭제한다.
pop()
- 배열 뒷부분의 값을 삭제
push()
- 배열 뒷부분에 값을 삽입
shift()
- 배열 앞부분의 값을 삭제
unshift()
- 배열 앞부분에 값을 삽입
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 배열에서 제거된 마지막 요소)를 배열의 밴 앞에 추가한다. 때문에 배열의 마지막 요소가 배열의 첫 번째 위치로 이동할 수 있게 된 것이다.
반대도 같은 원리!
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)]
을 사용하여 나머지 요소를 추출하고 두 부분을 합친다.
배열 쓰는 건 연습이 많이 필요할 것 같다.