211214 - 줄 서는 방법

이상해씨·2021년 12월 14일
0

알고리즘 풀이

목록 보기
33/94

◾ 줄 서는 방법 : 프로그래머스 LEVEL 3

문제

n명의 사람이 일렬로 줄을 서고 있습니다. n명의 사람들에게는 각각 1번부터 n번까지 번호가 매겨져 있습니다. n명이 사람을 줄을 서는 방법은 여러가지 방법이 있습니다. 예를 들어서 3명의 사람이 있다면 다음과 같이 6개의 방법이 있습니다.

  • [1, 2, 3]
  • [1, 3, 2]
  • [2, 1, 3]
  • [2, 3, 1]
  • [3, 1, 2]
  • [3, 2, 1]

사람의 수 n과, 자연수 k가 주어질 때, 사람을 나열 하는 방법을 사전 순으로 나열 했을 때, k번째 방법을 return하는 solution 함수를 완성해주세요.


입력

  • n은 20이하의 자연수 입니다.
  • k는 n! 이하의 자연수 입니다.

출력

  • 사람을 나열하는 방법을 사전 순으로 나열 했을 때, k번째 방법

입출력 예

nkresult
35[3,1,2]

◾ 풀이

1. 해설

  • 순열을 통해 확인하기 위해서는 최대 [20! = 2,432,902,008,176,640,000]의 계산이 필요하여 시간초과가 발생한다.
  • 따라서 최대 20번 반복하며 각 자리의 번호를 구해야한다.
  • 나눗셈을 통해 순서를 찾을 수 있다.
  • 예) n = 3, k = 5
k자리수자리수를 바꾸기 위해 필요한 경우의 수나머지peopleanswer
412!=220[1,2,3][3]
021!=100[1,2][3,1]
030!=100[2][3,1,2]

2. 프로그램

  1. k가 1부터 시작하므로 1을 줄인다.
  2. 계산에 필요한 팩토리얼을 미리 구해준다.
  3. 각 자리의 번호에 해당하는 인덱스를 구하여 추가한다.
  4. 3을 n번 반복한다.
# 코드
def solution(n, k):
    k -= 1
    answer = []

    factorial = [1] # 팩토리얼 리스트
    for i in range(1, n):
        if i == 1:
            factorial.append(i)
        else:
            factorial.append(factorial[i-1] * i)

    # 사람들의 번호 리스트
    peoples = [i for i in range(1, n+1)]

    # n번 반복하며 각 순서의 사람을 찾는다.

    while n != 0:
        temp = factorial[n-1]
        index, k = divmod(k, temp)
        answer.append(peoples.pop(index))
        n -= 1

    return answer

profile
후라이드 치킨

0개의 댓글

관련 채용 정보