코딩테스트

코딩테스트 공 던지기

김도현2 2023. 6. 2. 20:25
반응형

코딩테스트 공 던지기

 

 

문제 설명

 

 

 

출력 예시

 

 

머쓱이가 친구들과 공을 던지며 노는 문제입니다.

공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있다고 하네요.

정수 k가 주어졌을 때 k번째 공을 던질 사람을 찾아내는 문제입니다!

 

즉 [1,2,3,4] k=3 이렇게 문제가 있으면 세번째 던질 요소는 1입니다. 

1->3->1 이렇게 폴짝폴짝 뛰어 다니기 때문이죠~

 

바로 풀이 들어가보겠습니다

 

const numbers = [1, 2, 3, 4, 5, 6]; 
let k = 5;

var answer = 0;
let len = numbers.length;

//3

배열과 k가 주어졌습니다. 5번째 던질 차례인 사람을 찾는거기 때문에 폴짝뛰어보겠습니다~

1->3->5->1->3

답은 3이 나와야 합니다. 더 가봅시닷

 

 

const numbers = [1, 2, 3, 4, 5, 6]; 
let k = 5;

var answer = 0;
let len = numbers.length;

answer = ((k*2)-1)%len

//3

((k*2)-1)%len 이 공식을 쓰면 차례인 사람이 나옵니다!

 

k를 2만큼 곱하여 점프를 하고 -1을 해주어 던질 사람을 찾습니다. 

k가 큰 숫자일 경우 배열의 크기를 넘어가버리니 numbers 갯수만큼 나눠 나머지가 던질 사람 차례 값이 됩니다.

 

((2*5)-1)%6 = 3

 

5번째로 던질 사람은 요소 3 입니다!

답을 찾고 테스트를 해보니..

 

어라?? 실패가 뜹니다.. 무슨 일일까 하고 반례를 살짝 찾아보니,

 

 

const numbers = [1, 2, 3]; 
let k = 5;

var answer = 0;
let len = numbers.length;

answer = ((k*2)-1)%len

//0

이런경우 풀이를 해보면,

((5*2)-1)%3

9%3 = 0

 

나머지가 0이 나와 답을 못찾아 오는 상황이 되어버립니다..!

0이 나오는 경우 다른 문제도 디버깅을 해본결과 항상 마지막 요소가 던질 차례가 옵니다.

그러므로 조건문을 하나 달아주겠습니다.

 

 

 

 

const numbers = [1, 2, 3]; 
let k = 5;

var answer = 0;
let len = numbers.length;

answer = ((k*2)-1)%len;
if(answer == 0){
    answer = numbers[len-1]
}

//3

numbers의 마지막 배열을 골라주면 답이 잘 나오는 거 같습니다~

끝!!