개발자 HOON
πŸ› HOON DEVLog
개발자 HOON
전체 방문자
였늘
μ–΄μ œ
  • 😎 전체 μΉ΄ν…Œκ³ λ¦¬ (137)
    • πŸ“ μ‹ μž… 인터뷰 μ€€λΉ„ (7)
    • πŸ¦” μ·¨μ—…μ€€λΉ„ 기둝 (7)
    • β˜• μžλ°” : JAVA (5)
    • 🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS (80)
    • 🌱 λ°±μ—”λ“œ : Backend (13)
    • πŸ§ͺ 컴퓨터과학 : CS (11)
    • πŸ—‚ λ°μ΄ν„°λ² μ΄μŠ€ : DB (1)
    • πŸƒ‍♂️ DEVLOG (8)
    • βš™οΈ Trouble Shooting (5)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • GitHub
  • Resume

곡지사항

인기 κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
개발자 HOON

πŸ› HOON DEVLog

🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 쀄 μ„œλŠ” 방법 (level2, python)

2022. 10. 13. 21:36

🏝 문제 μ„€λͺ…

 

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! μ΄ν•˜μ˜ μžμ—°μˆ˜ μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예
3 5 [3,1,2]

μž…μΆœλ ₯ μ˜ˆμ‹œ μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1
문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.


 

🏝 풀이 μ½”λ“œ

import math

def solution(n, k):
    answer = []
    people = [i for i in range(1, n+1)]
    
    for i in range(1, n+1):
        divider = math.factorial(n-i)
        idx = k // divider
        if k % divider == 0:
            idx -= 1

        answer.append(people[idx])
        people.pop(idx)
        k -= idx * divider

    return answer

 

κ·œμΉ™ μ°ΎκΈ° λ¬Έμ œλ‹€.

 

브루트포슀둜 κ΅¬ν•˜λ©΄ μ–΄λ§ˆμ–΄λ§ˆν•œ μ—°μ‚° νšŸμˆ˜μ— μ˜ν•΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚œλ‹€.

λ¬Έμ œμ—μ„œ λ‚˜μ˜¨ μΌ€μ΄μŠ€λ₯Ό λ°”νƒ•μœΌλ‘œ 보자.

 

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

 

3λͺ…을 μˆœμ„œλŒ€λ‘œ 쀄을 μ„Έμš°λŠ” 방법을 μ‚¬μ „μˆœμœΌλ‘œ μ •λ ¬ν•œ κ²°κ³Όλ‹€.

κ°€μž₯ μ•žμ˜ μ‚¬λžŒμ„ 보면, 1번, 2번, 3번 μ‚¬λžŒμ΄ λ‚˜μ˜€λŠ” ꡬ간이 μžˆλ‹€.

 

각 κ΅¬κ°„μ˜ ν¬κΈ°λŠ” (n-1)!이닀.

λ”°λΌμ„œ (n-1)!의 ꡬ간이 총 n개 μžˆμœΌλ―€λ‘œ n!의 쀄 μ„Έμš°κΈ° κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것이닀.

 

answer 배열에 κ°€μž₯ 첫 번째 μžλ¦¬μ— 올 μ‚¬λžŒμ„ κ΅¬ν•˜λŠ” 방법은 λ¬Έμ œμ—μ„œ μ£ΌλŠ” kλ₯Ό ν™œμš©ν•˜λŠ” 것이닀.

k번째 μ‚¬λžŒμ΄ μ–΄λŠ ꡬ간에 μ†ν•˜λŠ”μ§€λ₯Ό νŒλ‹¨ν•œλ‹€. κ΅¬κ°„μ˜ 크기가 (n-1)!μ΄λ―€λ‘œ, k // (n-1)!을 ν•΄μ€€λ‹€. 이것을 뒀에 λ‚˜μ˜€λŠ” people의 index둜 μ“΄λ‹€.

people 배열에 1번 μ‚¬λžŒλΆ€ν„° n번 μ‚¬λžŒκΉŒμ§€ λ°°μΉ˜μ‹œμΌœλ†“κ³ , index + 1번째 번호의 μ‚¬λžŒμ΄ answer에 λ“€μ–΄κ°€μ•Ό ν•˜λ―€λ‘œ, index둜 μ ‘κ·Όν•˜λ©΄ λœλ‹€.

 

μ˜ˆμ™Έμ˜ 경우, kκ°€ (n-1)!의 배수라면 index μ΄ˆκ³Όκ°€ λ‚˜κΈ° λ•Œλ¬Έμ— index-1을 ν•΄μ€€λ‹€.

예λ₯Ό λ“€μ–΄, n=3, k=6인 경우, 6은 (n-1)!인 2의 배수이기 λ•Œλ¬Έμ— idxκ°€ 3이 λ‚˜μ˜¨λ‹€. n=3이면 people λ°°μ—΄ 속 μ‚¬λžŒμ€ 3λͺ…μ΄λ―€λ‘œ indexκ°€ 0, 1, 2둜 3은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 경우λ₯Ό μ˜ˆμ™Έμ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ index-1을 ν•΄μ€€λ‹€.

 

answer에 집어놓고, ν•΄λ‹Ή μ‚¬λžŒμ€ 쀄을 μ„Έμ› μœΌλ‹ˆ λŒ€κΈ°μ—΄μ—μ„œ ν•΄λ‹Ή μ‚¬λžŒμ„ μ œκ±°ν•œλ‹€. (people pop)

κ·Έ λ‹€μŒ λ°˜λ³΅λ¬Έμ—μ„œλŠ” k번째 μ‚¬λžŒμ΄ μ•„λ‹ˆλΌ μ•žμ˜ idx번의 ꡬ간을 μ§€λ‚œ ν›„μ˜ μ‚¬λžŒμ„ μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ idx * dividerλ₯Ό λΉΌμ€€λ‹€.

 

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ 동일쑰건 (μƒˆμ°½μ—΄λ¦Ό)

'🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 배달 (level2, python)  (0) 2022.10.13
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 섬 μ—°κ²°ν•˜κΈ° (level3, python)  (1) 2022.10.13
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] κ°€μž₯ λ¨Ό λ…Έλ“œ (level3, python)  (0) 2022.10.13
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 방금그곑 (level2, python)  (1) 2022.10.13
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] ν–‰λ ¬ ν…Œλ‘λ¦¬ νšŒμ „ (level2, python)  (0) 2022.10.13
    '🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 배달 (level2, python)
    • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 섬 μ—°κ²°ν•˜κΈ° (level3, python)
    • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] κ°€μž₯ λ¨Ό λ…Έλ“œ (level3, python)
    • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 방금그곑 (level2, python)
    개발자 HOON
    개발자 HOON
    쒋은 λ°±μ—”λ“œ μ—”μ§€λ‹ˆμ–΄κ°€ 되기 μœ„ν•œ 기둝을 λͺ¨μ•˜μŠ΅λ‹ˆλ‹€. # μ£Όλ‹ˆμ–΄ # λ°±μ—”λ“œ # 개발자

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”