공 던지기
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 < numbers의 길이 < 100
- 0 < k < 1,000
- numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
- numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
| [1, 2, 3, 4] | 2 | 3 |
| [1, 2, 3, 4, 5, 6] | 5 | 3 |
| [1, 2, 3] | 3 | 2 |
입출력 예 #1
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 1번에게 공을 던집니다.
입출력 예 #2
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 5번에게 공을 던집니다.
- 5번은 세 번째로 1번에게 공을 던집니다.
- 1번은 네 번째로 3번에게 공을 던집니다.
- 3번은 다섯 번째로 5번에게 공을 던집니다.
입출력 예 #3
- 1번은 첫 번째로 3번에게 공을 던집니다.
- 3번은 두 번째로 2번에게 공을 던집니다.
- 2번은 세 번째로 1번에게 공을 던집니다.
public class ThrowBall {
public static void main(String[] args) {
System.out.println(solution(new int[] {1,2,3,4,5,6,7,8,9},17));
}
public static int solution(int[] numbers, int k) {
int idx = 0;
int cnt = 0; // 길이가 홀수 일 때 idx값 0or1로 설정해줄 때 쓸 변수
while(k!=1) {
idx += 2;
if(idx > numbers.length-1) {
if(numbers.length%2 != 0 && cnt%2==0) {
idx=1;
cnt++;
}
else {
idx=0;
cnt++;
}
if(numbers.length%2==0) idx=0;
}
k--;
}
return numbers[idx];
}
}
위의 방법은 주어진 배열의 길이가 홀수일 때, 짝수일 때 나눠서 생각해보았다.
배열을 +2씩 순회하면서 만약 idx(인덱스)가 배열의 길이를 넘어가면 짝수일 경우 idx를 단순히 0으로 초기화 해주면 되지만 배열의 길이가 홀수일 경우 다시 처음으로 돌아오는 인덱스가 달라지기 때문에 두 가지의 경우로 나눠야했다.
1) 길이가 홀수이면서 배열을 cnt가 짝수번(0포함) 순회 했으면 idx를 1로 초기화 해줘야 한다.
2) 길이가 홀수이면서 배열을 cnt가 홀수번 순회 했으면 idx를 0으로 초기화 해줘야 한다.
이렇게 해도 풀었지만 코드가 지저분해서 다른 방법을 검색해보다가 가장 이해가 잘 갔던 코드로 다시 한 번 풀었다.
public class ThrowBall02 {
public static void main(String[] args) {
System.out.println();
}
public static int solution(int[] numbers, int k) {
int player = 1;
for(int i=0; i<k-1; i++) {
player+=2;
if(player>numbers.length) player-=numbers.length;
}
return player;
}
}
위의 코드는 앞서 했던 인덱스를 기준으로 하기 보단 배열안의 값을 기준으로 생각했다.
어차피 배열안의 숫자들은 1부터 차례대로 증가하기 때문이다.
player는 1부터 k는 1부터 세기 때문에 k-1까지 반복하면서 player+2씩 더해주면서
만약 player가 배열의 길이보다 넘어간다면 배열의 길이를 빼주면 된다.
여기서 배열의 길이를 빼준다는 것이 좀 헷갈렸는데
배열의 길이가 홀수일 때 player가 배열길이를 +1또는+2만큼 넘어가게 되는데 거기서 배열 길이만큼 빼주면
결국 player 1이 되거나 2가 된다.
배열의 길이가 짝수일 때는 결국 길이보다 항상 +1만큼만 크기 때문에 배열의 길이만큼 빼주면 1로만 바뀐다.
'CodingTest > Programmers' 카테고리의 다른 글
| [프로그래머스] Lv0 잘라서 배열로 저장하기 (0) | 2023.01.12 |
|---|---|
| [프로그래머스] Lv0 소인수분해 (0) | 2023.01.11 |
| [프로그래머스] Lv0 숨어있는 숫자의 덧셈 (2) (0) | 2023.01.09 |
| [프로그래머스] Lv.0 이진수 더하기** (0) | 2022.12.28 |
| [프로그래머스] Lv.0 7의 개수 (0) | 2022.12.28 |
댓글