공 던지기
문제 #
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers
와 정수 K
가 주어질 때, k
번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
- 제한사항
- 2 <
numbers
의 길이 < 100 - 0 <
k
< 1,000 numbers
의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.numbers
는 1부터 시작하며 번호는 순서대로 올라갑니다.
- 2 <
- 입출력 예
numbers k result [1, 2, 3, 4] 2 3 [1, 2, 3, 4, 5, 6] 5 3 [1, 2, 3] 3 2
나의 풀이 #
class Solution {
public int solution(int[] numbers, int k) {
int answer = 0;
int cnt = 0;
for(int i = 0; i<k*2; i=i+2){
if(i-(numbers.length*cnt) >= numbers.length)
cnt++;
answer = numbers[i-(numbers.length*cnt)];
}
return answer;
}
}
/*
number[i]가 number[i+2]에게 공을 던질때 다음번 공을 던지는 사람은 number[i+2]이므로 2만큼 증가하는 반복문 사용
k번 던져야 함으로 i가 k*2보다 작을경우로 조건설정
i의 값이 numbers의 길이보다 길 경우의 오류발생을 방지하기 위해 배열의 길이*배열순회횟수만큼 빼준다
*/
/* 5명이 5번 던지는 테스트 케이스 추가시
i=0, cnt=0 numbers[0] 1 -> 3
i=2, cnt=0 numbers[2] 3 -> 5
i=4, cnt=0 numbers[4] 5 -> 2
i=6, cnt=1 numbers[1] 2 -> 4
i=8, cnt=1 numbers[3] 4 -> 1
*/
다른 사람의 풀이 #
class Solution {
public int solution(int[] numbers, int k) {
return numbers[2 * (k - 1) % numbers.length];
}
}
class Solution {
public int solution(int[] numbers, int k) {
return (k-1)*2 % numbers.length+1;
}
}
//순환소수의 n자릿수 구하는 방식 이용
//numbers[i] 와 i+1이 같기때문에 동일한 결과
//k * 2 % numbers.length를 이용할 경우 받는 사람을 구할 수 있다.
//queue는 선입선출임을 이용
import java.util.*;
class Solution {
public int solution(int[] numbers, int k) {
int answer = 0;
Queue<Integer> queue = new LinkedList<>();
for(int num : numbers) queue.add(num);
int cnt = 1;
while(cnt !=k){
queue.add(queue.poll());
queue.add(queue.poll());
cnt++;
}
answer = queue.poll();
return answer;
}
}
관련개념 학습 #
- 관련 개념을 찾아서 공부한 내용을 적는다.
ctrl + p
로 내가 필기한 내용 중에서 관련내용이 있는지 찾아서 그 페이지의 링크를 복사하여 붙혀넣는다.- 필기 페이지에도 이 문제의 링크를 복사하여 “관련 문제"라고 써놓고 붙혀넣는다.