일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 알고리즘문제풀이
- backjoon
- leet code
- 트라이
- 전자공학
- 신호처리
- IOS
- SWIFT
- 스위프트
- 프로그래머스
- dft
- Leet Coding Challenge
- PYTHON
- leetcode
- 릿코드
- 카카오 코딩테스트
- 알고리즘 문제풀이
- SWIFTUI
- Trie
- DTFT
- 코테
- 알고리즘
- 파이썬
- 코테준비
- 컨볼루션
- 이산신호처리
- 코딩테스트
- 독서노트
- 백준
- DSP
Archives
- Today
- Total
매일 매일 성장하는 섭섭군
[Seop's의 코드풀이] 프로그래머스 줄 서는 방법 - Python 본문
반응형
programmers.co.kr/learn/courses/30/lessons/12936
문제 요약
서로다른 자연수 n 개를 나열하는 방법의 수 중 k 번째 수는 무엇인지 확인하는 문제이다.
모든 경우를 나열한 후 사전순으로 정렬 할 수 있지만 시간이 너무 오래 걸리는 문제가 발생한다.
그러므로 우리는 바로 K 번째 수를 구할 수 있어야 한다.
문제풀이 아이디어
- 서로다른 n개의 자연수로 이루어진 수열의 맨 앞자리가 수가 같은 경우는 한정되어 있다.
- 맨 앞자리수 부터 차례대로 구해 나간다면 모든 수열을 구하지 않고도 K번재 수를 구할 수 있다.
구하는 방법은 다음과 같이 구할 수 있다.
- 1 ... n 까지의 자연수가 존재하는 배열을 생성한다.
- 맨 앞자리가 같은 수의 수열의 개수는 (1번 배열의 길이 - 1)! 개 이다.(! : 팩토리얼)
- k 를 2번에서 구한 값으로 나눈 값에 해당하는 인덱스를 추출하여 정답 배열에 추가한다. (1번배열에서 삭제 후 정답배열에 추가)
나머지 값이 0 이라면 나눈 값에서 -1 을 진행한다. - 1번 배열이 없어질때까지 2~3번 과정을 반복한다.
코드
전체 코드는 다음과 같습니다. 피드백과 질문은 언제나 감사드립니다.
import math
def solution(n, k):
answer = []
num = [i for i in range(1, n+1)]
while num :
mid = math.factorial(len(num) - 1)
v, r = divmod(k,mid)
if r == 0 : v -= 1
answer.append(num.pop(int(v)))
k = k - v*mid
return answer
반응형
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[Seop's의 코드풀이] 프로그래머스 자물쇠와 열쇠 (0) | 2020.08.30 |
---|---|
[Seop's의 코드풀이] 프로그래머스 가사 검색 - Python (0) | 2020.08.28 |
[Seop's의 코드풀이] 프로그래머스 최고의 집합 - Python (0) | 2020.08.19 |
[Seop's의 코드풀이] 프로그래머스 실패율 (2019 KAKAO BLIND RECRUITMENT) - Python (0) | 2020.05.12 |
[Seop's의 코드풀이] 프로그래머스 불량사용자 - Python (0) | 2020.05.06 |
Comments