개발/코딩테스트

[프로그래머스 | JavaScript] 공던지기

prpn97 2023. 4. 10. 23:43

<문제 설명>

 

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

 

<입출력 예>

numbers k result
[1, 2, 3, 4] 2 3
[1, 2, 3, 4, 5, 6] 5 3
[1, 2, 3] 3 2

<문제 풀이>

function solution(numbers, k) {
    let answer = 0;
    let index = k*2-2
    let num = numbers[numbers.length-1]
    if(index < numbers.length){
        return numbers[index]
    }else if(index >= numbers.length){
        return index % num +1
    }
}

 

k번 공을 던졌을 때 위치할 가상의 인덱스를 찾고, numbers의 마지막 숫자만큼 계속 늘려서

해당하는 k번 공을 던졌을 때의 인덱스에 위치하는 값을 출력하려 했는데, 테스트케이스에서

몇가지 오류가 있어서 계속 쥐어짜내보았다. 

직접 numbers를 늘리지 않더라도 %를 사용하여 나머지값을 통해

허상의 인덱스값(k번 던졌을 때의 값)에서 기존 numbers의 인덱스 값을 나누고

그 나머지 값을 보면 그 위치가 보이는 것을 유추했다. 

 

예를 들어 1,2,3,4,5가 있고 4번 던진다고 하면, 머릿속으로는 빨리 계산할 수 있다. 

한 칸씩 건너뛰기 때문에 1,3,5,7 즉, 7번째 값이다. 5 다음에는 1,2가 나오므로 답은 2이다.

그러면 k=4이므로 [1,2,3,4,5,6,7]이라고 6,7을 넣어 가정하면, 

우리가 구해야 하는 7은 6번째 인덱스다.(인덱스는 0부터 시작하기 때문에)

그래서 index를 k*2-2로 두었다. 그리고 위에서 언급한 바와 같이 

그 값을 기존에 있던 numbers만큼 나누고 나머지 값을 보면 위치를 알 수 있다. 

위의 예시처럼 7을 찾으려면 7%5를 하면 2가 남고, 배열을 지난 뒤 그 2번째 값이 답인 것이다. 

 

식에서는 인덱스를 구했으나 답은 numbers가 지나면 인덱스와는 달리

1부터 시작하기 때문에 값을 구하고 1을 더해주면 된다. 

 

<코멘트>

어려운 문제가 아닌데, 0부터 시작하는 규칙과 1부터 시작하는 규칙이 헷갈려서

푸는데 오래 걸렸다. 주석처리를 하든 변수이름을 잘 정하든 해서

머릿속에 잘 정리해서 문제를 풀어야겠다. 

728x90