[python] 공 던지기
문제
https://school.programmers.co.kr/learn/courses/30/lessons/120843
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
원형으로 서서 공 던지기를 하고 있다.
공은 1번 부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있다.
사람의 번호가 들어있는 정수 배열 numbers와 정수 k가 주어질 때,
k번째로 공을 던지는 사람의 번호는 무엇인지 return 해라
test case
1) numbers = [1,2,3,4], k = 2, result = 3
2) numbers = [1,2,3,4,5,6], k= 5, result = 3
3) numbers = [1,2,3], k = 3, result = 2
나의 풀이(오답)
def solution(numbers, k):
if len(numbers)%2 ==0:
idx = k//(len(numbers)//2)
return numbers[2*idx]
else:
idx = k % len(numbers)
even = numbers[::2]
odd = numbers[1::2]
comli = [odd[0]]+even+odd[:-1]
return comli[idx]
numbers의 길이가 짝수인지 홀수인지에 따라 return 하는 값이 다르도록 설계하려 했지만 짝수번은 성공한 반면 홀수번은 실패했다..
인상적인 풀이
def solution(numbers, k):
return numbers[2 * (k - 1) % len(numbers)]
아주 수학적인 풀이인 코드이다.. ^^ 나도 이렇게 짜고 싶은데
나름 최선으로 이 식을 이해하려고 분석해봤다.
i) numbers가 짝수일때 (ex. numbers = [1,2,3,4])
k = 1,2,3,4,5....
k-1 = 0,1,2,3,4....
2(k-1) = 0,2,4,6,8...
2(k-1) % len(numbers) = 2(k-1)%4 = 0,2,0,2,0....
numbers[2(k-1)%len(numbers)] = 1,3,1,3,1....
이렇게 numbers의 길이가 짝수이면 인덱스가 짝수인 것만 반복해서 나오게 된다.
즉, 2(k-1)는 무조건 2로 나눠떨이지는 수이고 len(numbers)가 짝수이면 인덱스는 짝수 번째 인덱스밖에 안나온다.
ii) numbers가 홀수일때 (ex. numbers = [1,2,3,4,5])
k = 1,2,3,4,5,6,7,8...
k-1 = 0,1,2,3,4,5,6,7...
2(k-1) = 0,2,4,6,8,10,12,14...
2(k-1) % len(numbers) = 2(k-1) % 5 = 0,2,4,1,3,0,2,4...
numbers[2(k-1) % len(numbers)] = 1,3,5,2,4...
numbers의 길이가 홀수일때
2(k-1)은 0,2,4,6,8... 처럼 짝수로 이루어져있기 때문에 len(numbers)로 나눈 나머지인 짝수인덱스와 홀수인덱스를 얻을 수 있게 된다.
아무튼.. 엄청나다