[Programmers][Lv.3] 줄 서는 방법
[문제 링크] - https://programmers.co.kr/learn/courses/30/lessons/12936
문제 설명
제한사항
풀이
import math
def solution(n, k):
answer = []
k -= 1
order = [i for i in range(1, n+1)] # 순서 생성
for i in range(n):
num = math.factorial(len(order))
temp = num // len(order) # 현재 차례가 몇가지 경우의 수인지
idx = (k // temp) # 현재 차례가 몇 번째 수가 와야하는지
k %= temp # 다음 차례가 됨에 따라 차례 재 설정
answer.append(order.pop(idx)) # 현재 차례 숫자 answer에
return answer
처음엔 Permutation을 사용했으나 효율성문제답게 시간초과로 실패하였다.
그래서 다른 풀이를 생각해야 했고, 곧 팩토리얼을 통한 규칙을 찾을 수 있었다.
- 전체 경우의 수를 몇 개의 묶음으로 나눌 수 있었으며
- 그 묶음의 순번을 통해 순서를 자리마다 계산하였다.
- 그리고 다음 자리를 구하기 위해 순번을 재 설정하였다.
처음에 k에 -1을 해준것은 예시들을 넣어봐도
결과값으로 자꾸 다음 차례의 값이 나와서 한번 넣어봤는데 통과했다.
통과한 후에 다른 사람의 풀이들을 보니 k가 딱 나누어 떨어져 0이 되는 경우가 있어서 그런거였다....
그래서 answer.append
부분을 다음과 같이 수정하면 좀 더 논리에 맞는 코드가 된다.
if k == 0:
answer.append(order.pop(idx-1))
else:
answer.append(order.pop(idx))
결과
Author And Source
이 문제에 관하여([Programmers][Lv.3] 줄 서는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@meoldae/ProgrammersLv.3-줄-서는-방법저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)