Q. 정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.
function solution(numbers, direction) {
return direction === "right" ? [numbers[numbers.length - 1], ...numbers.slice(0, numbers.length - 1)] : [...numbers.slice(1, numbers.length), numbers[0]];
}
- 1단계. 본 문제에서 이동하는 것은
direction
이right
면 배열의 마지막 요소만 이동하고,left
인 경우 맨 앞의 요소만 이동한다는 것을 파악한다.- 2단계. 삼항연산자로 이동시킬 배열을 새 배열에 미리 배치시킨뒤, 남은 요소들을 slice()메서드를 이용하여 배치시킨다.
- 3단계. 여기서 핵심은 slice()메서드 사용시, 전개구문(...arr)을 사용해야 배열이 풀린 요소들이 들어갈 수 있다는 것을 파악해야한다.
Q. 머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
function solution(numbers, k) {
let cnt = 1;
for (let i = 0; ; i += 2){
i %= numbers.length
const item = numbers[i];
if (cnt == k) {
return item;
}
cnt += 1;
}
}
본 문제는 정답을 참고하여 풀이했기에, 내일 모레 풀이를 지우고 다시 풀어봐야함
- 1단계. 문제에서 요구하는 반복 패턴은 배열의 요소가 2칸씩 앞으로 나아간다는 것이다. 다만, 반복해서 나간 패턴이 배열의 길이를 초과하는 경우, 앞으로 돌아가야 한다는 점을 파악해야한다.
- 2단계. 여기서 패턴을 배열의 길이로 나누었을때 생기는 나머지가 그 다음으로 가야할 패턴의 순번과 같아진다는 것이 핵심이다. 그리고 이는 배열의 길이보다 작을 때도 적용가능하다.
- 3단계. 따라서 반복문을 작성할 때, 복합 연산자인
%=
를 사용하여 배열의 순번을 반복한다.- 4단계. 이 순환을 k번째 일때 그만 둘 것이기에 새로운 변수인 cnt를 만들어, 반복의 범위를 정하여 마무리한다.