머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
제한사항 2 < numbers의 길이 < 100 0 < k < 1,000 numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다. numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
2) 예시
Result Table
numbers
k
result
[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번에게 공을 던집니다.
3) 풀이
1. 클래스 선언을 해줍니다
● class Solution {
클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.
2. 정수배열 numbers와 정수 k을 매개변수로 하는 solution 메소드를 선언합니다.
solution은 정수를 반환하므로 데이터타입을 int로 합니다.
● public int solution(int[] numbers, int k) {
3. 제한사항을 검사합니다. 제한사항을 만족하지 않을 경우, 예외처리합니다.
● if (numbers.length < 2 || numbers.length >= 100 || k <= 0 || k >= 1000) { throw new IllegalArgumentException("제한사항을 확인하세요"); }
4. numbers 배열에서 값만 딱 맞게 꺼내주면 되는 문제입니다.
index를 찾아줄 때 아래와 같은 사항들을 고려합니다.
k-1 을 해준 이유 : 첫번째 뽑은 사람은 index 0 이므로 0을 만들어주기 위함입니다.
* 2 를 해준 이유: 오른쪽으로 한칸 건너띄고 그 다음 사람에게 던져야하기 때문입니다.
% numbers.length를 해준 이유 : 만약 (k-1) * 2가 numbers.length를 초과한 경우를 방지하기위해서입니다.
● return numbers[((k-1)*2)%numbers.length]; } }
4) 코드
class Solution {
public int solution(int[] numbers, int k) {
if (numbers.length < 2 || numbers.length >= 100 || k <= 0 || k >= 1000) {
throw new IllegalArgumentException("제한사항을 확인하세요");
}
return numbers[((k-1)*2)%numbers.length];
}
}
5) 느낀점
단순한 문제였으나 어떻게 인덱스를 찾아내야할까 에서 고민을 많이 했습니다.
처음에는 numbers.length를 2로 나눠서 홀수일 때, 짝수일 때 케이스를 나눠서 그에 따른 index 계산법을 달리해야하나 싶었지만, 하다보니 결국 계산방법이 동일해서 홀짝 if문을 없애고 그냥 return문으로 바로 돌렸습니다.
또한, numbers.length를 초과한 경우처리에 대해 제일 처음에는 numbers.length를 한번 빼주었지만 그렇게 될 경우 1회성에 그쳐버려 % 연산기호를 이용하도록 변경하여 문제를 해결할 수 있었습니다.