Programmers_연습문제 줄 서는 방법(python)
프로그래머스 -줄 서는 방법 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/12936#
2. 분류 및 난이도
Programmers 문제입니다.
연습문제 문제입니다.
Level 3난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- brute하게 모든 경우의 수를 구하는 방법(python의 combinations)은 시간초과가 뜹니다.
- 고등학교 때 배운 경우의 수를 생각하면 먼저 한자리를 정해놓고 [정한수, ?, ?, ? ] 3가지를 세우는 방법은 3!입니다.
- 전체 경우의 수는 n인 4인 기준으로 3! * 3! * 3! * 3!의 경우의 수입니다. (맨 앞이 1인 경우 , 2인 경우, 3인 경우, 4인 경우 4가지 해서)
- 그렇기에 n!의 경우의 수가 나오고, 문제에서도 최대 20!까지 나온다고 써있습니다.
- 각 자리수는 (k-1)(찾는 수) // 남은 자릿수의 팩토리얼로 나타낼 수 있습니다.
- k-1인 이유는 0부터 찾는게 아닌, 1부터 찾는 문제이기 때문에 맨 끝의 경계선을 고려했기 때문입니다.
- k -= (나눈몫 * 팩토리얼값)으로 나타납니다.
- n이 4 이고, k = 24인 경우 [4,3,2,1]로 나타내야하는데, 위에서 4를 골라주고 k -=(몫 * 팩토리얼값)[18]은 6이 됩니다.
- 6은 n이 3이고, k = 6인 경우 [3,2,1]을 나타내는 수와 동일하므로 이런 식으로 경우의 수를 줄여가는 것입니다.
- del을 해주는 이유는 배열을 비워놔야 위에서 구한 인덱스들을 잘 찾아가기 때문입니다.
4. 접근 방법을 적용한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def makefact(num) :
res =1
for i in range(1,num+1) :
res*=i
return res
def solution(n, k):
answer = []
person = [0] * n
for i in range(n) :
person[i] = i+1
for i in range(n) :
fact = makefact(n-i-1)
answer.append(person[(k-1)//fact])
mod = (k-1)//fact
del person[mod]
k -=(mod* fact)
return answer
5. 결과
필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.
This post is licensed under CC BY 4.0 by the author.