공 던지기
문제설명 :
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해 보세요.
제한 사항
- 2 < numbers의 길이 < 100
- 0 < k < 1,000
- numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
- numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
입출력 예
my_string | k | result |
[1, 2, 3, 4] | 2 | 3 |
[1, 2, 3, 4, 5, 6] | 5 | 3 |
[1, 2, 3] |
3 | 2 |
첫 번째 접근
: 공을 받는 순서를 보니 나름의 패턴이 있었다.
배열의 길이가 홀수인 경우, 홀수 번호의 사람들이 순서대로 공을 받고, 이후 짝수 번호의 사람들이 순서대로 공을 받는 순서였다.
반대로 배열의 길이가 짝수인 경우, 홀수 번호의 사람들만 순서대로 공을 받았다.
그래서 배열의 길이가 홀수인 경우, 배열 order에 홀수 번호를 먼저 push 한 후 짝수 번호를 push 했다.
마찬가지로 배열의 길이가 짝수인 경우, 배열 order에 홀수 번호만 push 했다.
이후 k가 order의 길이보다 작거나 같으면 order [k - 1]을, 그렇지 않으면 order[k % order.length - 1] 을 반환했다.
테스트 케이스는 통과했지만, 최종 통과가 되지 않았다.
function solution(numbers, k) {
let order = [];
if(numbers.length % 2){
numbers.forEach(el => el % 2 !== 0 ? order.push(el) : '')
numbers.forEach(el => el % 2 === 0 ? order.push(el) : '')
} else {
numbers.forEach(el => el % 2 !== 0 ? order.push(el) : '')
}
return k <= order.length ? order[k-1] : order[k % order.length - 1]
}
두 번째 접근
: 정말 모르겠어서, 이 문제는 도움을 받았다.
내가 놓치고 있던 부분은, 'order [k % order.length - 1] = undefined' 인 경우였다.
k와 order.length의 값이 같은 경우, 'order[ -1 ]'이 나오니 undefined를 반환한다.
그래서 이 부분에 대한 예외처리가 필요했다.
여기에 해당하는 테스트 케이스는, numbers = [1, 2, 3], k = 6, return=2인 경우다.
function solution(numbers, k) {
let order = [];
if(numbers.length % 2){
numbers.forEach(el => el%2 !== 0 ? order.push(el) : '')
numbers.forEach(el => el%2 === 0 ? order.push(el) : '')
} else {
numbers.forEach(el => el%2 !== 0 ? order.push(el) : '')
}
return k % order.length === 0 ? order[order.length - 1] : order[k%order.length - 1]
}
// concat()을 사용하면 더 깔끔하다
solution
function solution(numbers, k) {
let order = [];
const oddNumbers = numbers.filter(x => x % 2 === 1);
const evenNumbers = numbers.filter(x => x % 2 === 0);
if(numbers.length % 2){
order = order.concat(oddNumbers.concat(evenNumbers));
} else {
order = oddNumbers;
}
const idx = k % order.length === 0 ? order.length - 1 : k % order.length - 1;
return order[idx]
}
function solution(numbers, k) {
return numbers[((2 * (k -1))) % numbers.length];
}
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
JS Practice) 프로그래머스 : 잘라서 배열로 저장하기 (0) | 2023.03.28 |
---|---|
JS Practice) 프로그래머스 : 소인수분해 (0) | 2023.03.27 |
JS Practice) 프로그래머스 : 영어가 싫어요 (0) | 2023.03.23 |
JS Practice) 프로그래머스 : 한 번만 등장한 문자 (0) | 2023.03.22 |
JS Practice) 프로그래머스 : 숨어있는 숫자의 덧셈(2) (0) | 2023.03.21 |