일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- test-helper
- 1단계
- 그리디
- Python
- 구현
- 전산기초
- AWS
- 머신러닝
- MySQL
- 모두를 위한 딥러닝 강좌 시즌1
- docker
- 이것이 코딩테스트다 with 파이썬
- 프로그래머스
- 백준
- STL
- ssd
- 파이썬
- ubuntu
- pytorch
- 3단계
- 2단계
- Object detection
- C++
- cs
- 실전알고리즘
- 딥러닝
- 자료구조 및 실습
- 코드수행
- SWEA
- CS231n
- Today
- Total
곰퓨타의 SW 이야기
[프로그래머스 level3 줄 서는 방법] 규칙 찾기 본문
해결해야하는 문제는 다음과 같았다.
https://programmers.co.kr/learn/courses/30/lessons/12936
코딩테스트 연습 - 줄 서는 방법
n명의 사람이 일렬로 줄을 서고 있습니다. n명의 사람들에게는 각각 1번부터 n번까지 번호가 매겨져 있습니다. n명이 사람을 줄을 서는 방법은 여러가지 방법이 있습니다. 예를 들어서 3명의 사람
programmers.co.kr
아주 오랜만에 코딩해볼겸 풀어보았다!
첫번째 아이디어는 다음과 같다.
1. itertools를 이용하여 모든 순열 경우의 수 구하기
2. 파이썬 내장함수 sort를 통해 sorting하기
3. k-1번째에 해당하는 리스트 return하기
아이디어를 바탕으로 작성한 코드는 다음과 같다.
(정확성 테스트 중 두 개의 테스트케이스에서 시간 초과가 나고, 효율성테스트는 하나도 통과가 안된다.)
from itertools import permutations
def solution(n, k):
# itertools 순열 경우의 수 구하기
arr = [i for i in range(1,n+1)]
answer = list(permutations(arr,n))
# sort
answer.sort()
# k-1번째 원소 return
return list(answer[k-1])
효율성 테스트를 위해 고민한 아이디어는 다음과 같다.
하나씩 쓰며 규칙을 찾은 뒤, 어떤 방식으로 작성할지 고민하였다.
1. 0!부터 n!까지의 factorial을 저장, 1~n의 숫자를 num 배열에 저장
2-1. n>2인 경우, 해당 자리에 와야하는 숫자 구함
2-1-1. _ _ _ : 3번째 자리수의 경우 (3-1)! 개의 숫자를 가질 수 있음
- k 가 (n-1)!로 나누어 떨어지지 않는 경우
- num에서 k//(n-1)! 번째 숫자를 가져옴
- 추후, k에서 현재 자릿수에서 계산된 값을 빼기 위해 tmp에 idx*fact[n-1] 저장
- k가 (n-1)!로 나누어 떨어지는 경우
- num에서 k//(n-1)! - 1 번째 숫자를 가져옴
- 추후, k에서 현재 자릿수에서 계산된 값을 빼기 위해 tmp에 idx*fact[n-1] 저장
3. 이번 자릿수에서 빠지는 수를 answer에 저장
4. k와 n을 업데이트
- k = k-tmp
- n = n-1
5. answer에 마지막으로 남은 num 저장
아이디어를 바탕으로 작성한 코드는 다음과 같다.
def solution(n, k):
answer = []
num = [i for i in range(1,n+1)]
tmp = 1
fact = [1]
for i in range(1,n+1):
tmp *= i
fact.append(tmp)
while n > 1 :
if n==2 and k==2:
idx = 1
elif n==2 and k==1:
idx = 0
elif k%fact[n-1]>0 :
idx = k//fact[n-1]
tmp = idx*fact[n-1]
else :
idx = k//fact[n-1]-1
tmp = idx*fact[n-1]
answer.append(num[idx])
num.pop(idx)
k -= tmp
n -= 1
answer.append(num.pop())
return answer
print(solution(4,10))
'TIL > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level1 나머지가 1이 되는 수 찾기] % 활용하기 (0) | 2021.11.07 |
---|---|
[프로그래머스 level2 n^2 배열 자르기] list comprehension 사용해보기 (0) | 2021.11.06 |
[프로그래머스 level2 교점에 별 만들기] 하나씩 확인하여 문제 해결하기 (0) | 2021.11.06 |
[프로그래머스 level3 섬 연결하기] 크루스칼 알고리즘 활용하기 (0) | 2021.10.08 |
[프로그래머스 level2 9주차_전략망을 둘로 나누기] find, union 활용법 & dfs 활용법 (0) | 2021.10.06 |