[js] 공 던지기 (lv.0, 정답률 81%)

sookyoung.k·2024년 5월 10일
0
post-thumbnail

머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 2 < numbers의 길이 < 100
  • 0 < k < 1,000
  • numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
  • numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.

나의 풀이

function solution(numbers, k) {
    let idx = (2 * (k-1)) % numbers.length;
    return numbers[idx];
}

길이가 2씩 커지는 등차수열인 것은 알았는데 나머지 값을 구하면 되는 걸 엄청 복잡하게 풀어서 잊지 않으려 올려본다.

길이가 2씩 커지는 등차수열을 구하는 것은 (2 * (k-1))을 통해서 구했다. 하지만 주어진 배열 안에서의 순서를 정하는 것이기 때문에 배열의 크기를 나누어 나머지를 찾으면 그것이 바로 배열의 인덱스를 찾는 것… 뭔가 설명이 이상한데 하여튼 어렵게 풀었다. (배열의 범위를 넘어서지 않게 하는 것)

다른 풀이 1

function solution(numbers, k) {
    return numbers[(--k*2)%numbers.length];
}

k에서 1을 빼주고 2를 곱한다. 그리고 배열의 크기를 넘어서지 않기 위해서 배열의 크기로 나눈 몫의 나머지를 구해 바로 인덱스 값으로 넘겨준다.

다른 풀이 2

function solution(numbers, k) {
    const [idx, len] = [k * 2 - 1, numbers.length];
    const findIdx = idx >= len ? idx % len : idx;
    return findIdx;
}

여기는 조금 특이하게 풀이한 것 같아서 가져와봤다.

k에 2를 곱한 후 1을 빼서 새로운 인덱스 idx를 계산한다. k 번째 요소를 기준으로 특정한 방식으로 인덱스를 조정하기 위한 것이다. 그리고 numbers 배열의 크기를 len으로 저장한다.

만약 idx가 len 보다 크다면 idx를 len으로 나눈 나머지를 findIdx로 설정한다. 배열의 범위를 넘어갈 경우 이렇게 해주고, 작다면 idx자체가 findIdx가 된다. 그 후 최종적으로 계산된 findIdx를 반환한다.

이건 어차피 배열이 1 부터 순차적으로 커지는 거라서…? 이렇게 푼 건가…?

profile
영차영차 😎

0개의 댓글