머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
1차 시도 실패
def solution(numbers, k):
answer = (1 + (2 * (k - 1))) % len(numbers)
return answer
세 번째 예시에서
1번은 첫 번째로 3번에게 공을 던지고,
3번은 두 번째로 2번에게 공을 던지고
2번은 세 번째로 1번에게 공을 던진다.
1부터 값이 2씩 k번만큼 커지고 이것을 리스트 개수만큼 나눈 나머지로 구하는 방법을 생각했는데 몇몇 테스트 케이스를 통과하지 못했다.
...
첫 번째 시도의 1을 나눈 나머지를 구하기 전에 더하지 않고, 2 * (k -1)
을 먼저 리스트 개수로 나눈 나머지에 1을 더했더니 통과했다.
def solution(numbers, k):
answer = (2 * (k - 1)) % len(numbers) + 1
return answer
첫 번째 풀이가 틀린 이유를 찾아보자!
numbers 개수가 5이고, k가 3일 때, 실패했던 코드에서는 (1 + (2 * (k - 1))) % len(numbers)
에서 5 % 5 이므로 0이 나온다. 반면 통과한 코드에서는 4 % 5 + 1이므로 5가 나온다. 나머지가 0이 되는 경우 문제가 발생했다.
1의 위치에 따라 결과가 달라지는데 꼼꼼하게 따지지 못했다.😢
다른 풀이로는 어차피 numbers
는 1부터 순서대로 값이 올라가기 때문에 굳이 1을 더하지 않고 인덱스로 접근하는 방법도 있다.
def solution(numbers, k):
return numbers[2 * (k - 1) % len(numbers)]