<문제 설명>
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 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부터 시작하는 규칙이 헷갈려서
푸는데 오래 걸렸다. 주석처리를 하든 변수이름을 잘 정하든 해서
머릿속에 잘 정리해서 문제를 풀어야겠다.
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 겹치는 선분의 길이 (0) | 2023.04.14 |
---|---|
[프로그래머스 | JavaScript] 평행 (0) | 2023.04.13 |
[프로그래머스 | JavaScript] 저주의 숫자 3 (0) | 2023.04.12 |
[프로그래머스 | JavaScript] 치킨 쿠폰 (0) | 2023.04.11 |
[프로그래머스 | JavaScript] 컨트롤제트 (0) | 2023.04.08 |