l._.been 2023. 5. 27. 15:46
728x90
문제

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)로 나눈 나머지인 짝수인덱스와 홀수인덱스를 얻을 수 있게 된다.

 

아무튼.. 엄청나다