반응형
Solution.py
처음에는 permutations로 순열을 이용해 문제를 풀었는데
Lv2 답게 간단하게 문제가 풀릴일이 없이 효율성, 시간 초과로 실패했습니다.
이 문제를 풀기 위해서는 수학적으로 접근해야하는데,
먼저 맨 앞의 숫자가 1일 때, 1을 맨 앞의 원소로 갖는 순열은 [1, 2, 3] , [1, 3, 2] 로 총 두 가지 입니다.
이 경우의 수는 (n - 1)!을 계산했을 시 나올 수 있는 경우의 수가 됩니다.
파이썬의 math 모듈에서 factorial() 팩토리얼 메서드를 제공 해줍니다,
그 다음으로는 이 문제에서 k 번째 방법을 반환하라고 했는데, k의 수를 인덱스 값으로 변환하여 k - 1 을 해줘야합니다.
k 번째에 있는 수를 구하기 위해서
(k - 1) // math.factorial(n - 1) 으로 몫을 구해 k 번째 순열에 첫 번째 있는 값의 인덱스를 찾습니다.
여기서는 k가 5이 므로 위 식에 대입했을 시 index 값은 2가 되며 arr[2]에 있는 값이 k 번째 순열의 첫 번째 값이 됩니다.
그러면 첫 번째 숫자가 결정 되었으므로, 다음에 올 숫자를 구하기 위해
k는 k % math.factorial(n - 1)으로 나머지 값이 되며 n을 1씩 감소 시켜 그 다음에 오는 원소를 구해갑니다.
정답 코드
import math
def solution(n, k):
arr = [i for i in range(1, n + 1)]
answer = []
while arr:
a = (k - 1) // math.factorial(n - 1)
answer.append(arr.pop(a))
k = k % math.factorial(n - 1)
n -= 1
return answer
'◼ 코딩테스트 > 구현 (Implementation)' 카테고리의 다른 글
[Python/파이썬] 프로그래머스 Lv1 - 달리기 경주 (0) | 2023.04.11 |
---|---|
[Python/파이썬] 프로그래머스 Lv2 - 숫자 나누기 (유클리드호제법) (0) | 2023.04.04 |
[Python/파이썬] 프로그래머스 Lv2 - 수식 최대화 (카카오 인턴쉽) (0) | 2023.03.10 |
[Python/파이썬] 프로그래머스 Lv2 - 방금그곡 (카카오 블라인드) (0) | 2023.03.09 |
[Python/파이썬] 프로그래머스 Lv2 - 두 큐 합 같게 만들기 (카카오 인턴쉽) (0) | 2023.03.09 |