ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1722 μˆœμ—΄μ˜ μˆœμ„œ with Python
    PS 2022. 8. 9. 17:18
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1722 μˆœμ—΄μ˜ μˆœμ„œ

    πŸ’‘ 쑰건

    1. 1λΆ€ν„° NκΉŒμ§€μ˜ 수λ₯Ό μž„μ˜λ‘œ λ°°μ—΄ν•œ μˆœμ—΄μ€ 총 N! = NΓ—(N-1)×…×2Γ—1 가지가 μžˆλ‹€.
    1. μž„μ˜μ˜ μˆœμ—΄μ€ 정렬을 ν•  수 μžˆλ‹€.
      예λ₯Ό λ“€μ–΄ N=3인 경우 {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}의 μˆœμ„œλ‘œ 생각할 수 μžˆλ‹€.
    1. N이 주어지면, μ•„λž˜μ˜ 두 μ†Œλ¬Έμ œ 쀑에 ν•˜λ‚˜λ₯Ό ν’€μ–΄μ•Ό ν•œλ‹€.
      kκ°€ 주어지면 k번째 μˆœμ—΄μ„ κ΅¬ν•˜κ³ , μž„μ˜μ˜ μˆœμ—΄μ΄ 주어지면 이 μˆœμ—΄μ΄ λͺ‡ 번째 μˆœμ—΄μΈμ§€λ₯Ό 좜λ ₯ν•˜λŠ” 문제
    1. 첫째 쀄에 N(1 ≀ N ≀ 20)이 주어진닀.
    1. 1인 경우 k(1 ≀ k ≀ N!)λ₯Ό μž…λ ₯λ°›κ³ , 2인 경우 μž„μ˜μ˜ μˆœμ—΄μ„ λ‚˜νƒ€λ‚΄λŠ” N개의 수λ₯Ό μž…λ ₯λ°›λŠ”λ‹€.
      N개의 μˆ˜μ—λŠ” 1λΆ€ν„° NκΉŒμ§€μ˜ μ •μˆ˜κ°€ ν•œ λ²ˆμ”©λ§Œ λ‚˜νƒ€λ‚œλ‹€.
    1. μˆ˜ν•™, μ‘°ν•©λ‘  μœ ν˜•μ˜ 문제

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제 1

    4
    1 3

    μ‹€ν–‰κ²°κ³Ό 1

    1 3 2 4

    예제 2

    4
    2 1 3 2 4

    μ‹€ν–‰κ²°κ³Ό 2

    3

    ⌨️ 문제 풀이

    1. N이 μ΅œλŒ€ 20κΉŒμ§€λΌλ©΄, 브루트포슀둜 ν’€μ΄ν–ˆμ„ λ•Œ μ‹œκ°„λ³΅μž‘λ„κ°€ μ΅œμ•…μ˜ 경우 20! = 2,432,902,008,176,640,000 κ°€μ§€μ˜ 경우의 μˆ˜κ°€ λ‚˜μ˜¨λ‹€.
      무쑰건 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚  수 밖에 μ—†λ‹€.
    1. μž…λ ₯ μˆœμ—΄μ΄ λ§Œμ•½ [3, 4, 1, 2]κ°€ μž…λ ₯λ˜μ—ˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.
      1둜 μ‹œμž‘ν•˜λŠ” [1, ?, ? ,?]와 같은 μˆœμ—΄μ˜ 경우의 κ°œμˆ˜λŠ” 3!이닀.
      2둜 μ‹œμž‘ν•˜λŠ” [2, ?, ? ,?]와 같은 μˆœμ—΄μ˜ 경우의 κ°œμˆ˜λŠ” 3!이닀.
    1. μž…λ ₯을 받은 μˆœμ—΄μ€ 3으둜 μ‹œμž‘ν•œλ‹€. λ”°λΌμ„œ
      [3, 1, ?, ?]둜 μ‹œμž‘ν•˜λŠ” μˆœμ—΄μ˜ 경우의 κ°œμˆ˜λŠ” 2!이닀.
      [3, 2, ?, ?]둜 μ‹œμž‘ν•˜λŠ” μˆœμ—΄μ˜ 경우의 κ°œμˆ˜λŠ” 2!이며, 3도 λ§ˆμ°¬κ°€μ§€μ΄λ‹€.
    1. 이 ν›„μ˜ κ°œμˆ˜λŠ” [3, 4, 1, ?] 1개.
      2번 λΆ€ν„° 4번의 과정을 λ”ν•˜λ©΄ λͺ‡ 번째 μˆœμ—΄μΈμ§€ μ•Œ μˆ˜κ°€ μžˆλ‹€.
    1. 이와 같은 과정을 λ°˜λŒ€λ‘œ μ§„ν–‰ν•˜λ©΄ K번째 μˆœμ—΄μ„ 좜λ ₯ν•  수 μžˆλ‹€.

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    
    n = int(stdin.readline())
    data = list(map(int, stdin.readline().split()))
    cache = {}
    
    
    def find_permutations(n):
        if n in cache:
            return cache[n]
    
        elif n <= 1:
            return 1
    
        else:
            cache[n] = n * find_permutations(n - 1)
            return cache[n]
    
    
    if data[0] == 1:
        k = data[1]
        arr = [x for x in range(1, n + 1)]
        ans = []
    
        for i in range(n):
            x = find_permutations(n - 1 - i)
            step = (k - 1) // x
            ans.append(arr[step])
            arr.remove(arr[step])
            k -= x * step
    
        print(*ans)
    
    else:
        input_permu = data[1:]
        sort_permu = sorted(data[1:])
        ans = 1
    
        for i in range(n):
            step = sort_permu.index(input_permu[i])
            sort_permu.remove(input_permu[i])
            x = find_permutations(n - 1 - i)
            ans += x * step
    
        print(ans)
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.