class Solution {
public int solution(int[] numbers, int k) {
int answer = 0;
for (int i = 0; ; i += 2) {
// i는 공을 던지는 사람의 인덱스
// i는 0으로 초기화
// 반복할 때 마다 2씩 증가 = 오른쪽으로 한명을 건너 뛰어 던지는 사람
if (k > 0) { // k 가 0보다 크다면
answer = numbers[i % numbers.length]; // 선택한 사람의 인덱스를 구하기
// i를 numbers 배열의 길이로 나눈 나머지를 구하면, i가 배열의 길이를 넘어가더라도 순환하면서 선택한 사람의 인덱스를 계산
// i가 2고 numbers.length가 3일 때 2/3 = 1
// i가 2이고 numbers.length가 4일 때 2/4 = 2
k--;
// k를 1씩 감소시키면서 반복문을 실행하면서, k가 0이 되는 순간에 answer에 저장된 사람의 번호가 k번째로 공을 던지는 사람의 번호가 됨
// 반복문 내에서 k를 감소시키기 전에 answer에 해당 사람의 번호를 할당하고 있으므로,
// 0보다 큰 동안 반복문이 실행되고 k--를 통해 k 값을 감소하고 k번째로 공을 던질 사람의 번호를 찾음
} else {
break;
}
}
return answer;
}
}
i가 2이고 numbers.length가 4인 경우를 그림으로 설명해드리겠습니다. 친구들이 동그랗게 서 있는 상황에서 numbers.length가 4이므로 친구들은 0번부터 3번까지 번호가 매겨져 있습니다. 여기서 i가 2라고 가정해봅시다.초기 상태:
Copy code
0 1 2 3
^ ^ o
현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
Copy code
0 1 2 3
^ ^ o
현재 공을 받을 차례인 사람은 0번입니다. 공은 0번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
markdownCopy code
0 1 2 3
^ o
현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
Copy code
0 1 2 3
^ o
현재 공을 받을 차례인 사람은 1번입니다. 공은 1번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
```
Copy code
0 1 2 3
o
```
현재 공을 받을 차례인 사람은 **`3`**번입니다. 공은 **`3`**번 사람에게 던져집니다.
따라서 i가 2이고 numbers.length가 4일 때, numbers[2]인 2번 사람이 선택되어 공을 받습니다.
i가 2이고 numbers.length가 3인 경우를 그림으로 설명해드리겠습니다. 친구들이 동그랗게 서 있는 상황에서 numbers.length가 3이므로 친구들은 0번부터 2번까지 번호가 매겨져 있습니다. 여기서 i가 2라고 가정해봅시다.초기 상태:
Copy code
0 1 2
^ ^ o
현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
Copy code
0 1 2
^ o
현재 공을 받을 차례인 사람은 1번입니다. 공은 1번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
Copy code
0 1 2
o
현재 공을 받을 차례인 사람은 0번입니다. 공은 0번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
Copy code
0 1 2
^
현재 공을 받을 차례인 사람은 2번입니다. 공은 2번 사람에게 던져집니다.
오른쪽으로 한 명 건너뛴 상태:
```
markdownCopy code
0 1 2
^
```
현재 공을 받을 차례인 사람은 **`1`**번입니다. 공은 **`1`**번 사람에게 던져집니다.
계속해서 사람들을 순환하면서 오른쪽으로 한 명씩 건너뛰며 공을 던지게 됩니다.
따라서 i가 2이고 numbers.length가 3일 때, numbers[2]인 2번 사람이 선택되어 공을 받습니다.
k--를 사용하는 이유는 주어진 문제에서 k번째로 공을 던지는 사람의 번호를 찾기 위해서k의 값을 감소시키는 이유는 반복문이 실행될 때마다 k번째로 공을 던질 사람의 번호를 찾기 위해서k를 1씩 감소시키면서 반복문을 실행하면서, k가 0이 되는 순간에 answer에 저장된 사람의 번호가 k번째로 공을 던지는 사람의 번호가 됨k를 감소시키기 전에 answer에 해당 사람의 번호를 할당하고 있으므로, k값이 0보다 큰 동안 반복문이 실행되고 k--를 통해 k 값을 감소시킴k번째로 공을 던질 사람의 번호를 찾을 수 있음k--를 해줌으로써 반복문을 통해 k번째로 공을 던지는 사람의 번호를 찾을 수 있는 로직을 구현할 수 있음k--가 없는 경우, 즉 k 값을 감소시키지 않는다면 반복문이 무한히 실행되어 종료되지 않는 상황이 발생k를 감소시키지 않는다면 k의 값은 변하지 않고 계속해서 초기값을 유지k가 0보다 큰 조건을 항상 만족하게 되어 반복문이 무한히 실행k의 초기값이 3이고 numbers.length가 5인 경우k를 감소시키지 않는다면 항상 k 값이 3인 상태로 반복문이 실행if (k > 0)는 항상 참이 되어 반복문이 무한히 실행k 값을 감소시켜주는 k--가 없다면 반복문이 무한루프에 빠지게 되므로, k번째로 공을 던지는 사람을 찾을 수 없음