Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 1722. ์ˆœ์—ด์˜ ์ˆœ์„œ

deo2kim 2020. 9. 4. 08:51
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

S1 | ์ˆ˜ํ•™, ์กฐํ•ฉ๋ก 

์ˆœ์—ด์„ ๋ณด๋ฉด itertools์˜ permutation์ด ์ƒ๊ฐ๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” N์ด 20๊นŒ์ง€ ์ด๋ฏ€๋กœ 20!์„ ๊ตฌํ•˜๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ.

 

๋จผ์ € ์†Œ๋ฌธ์ œ1์ผ ๋•Œ์˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

N = 5, K = 35 ์ผ ๋•Œ(5๊ฐœ์˜ ์ˆซ์ž, 35๋ฒˆ์งธ ์ˆœ์—ด)

N = 5 ์ด๋ฏ€๋กœ 5! = 120์ด๋‹ค. 120 / N ์œผ๋กœ ๋‚˜๋ˆ„๋ฉด 24๊ฐ€ ๋˜๋Š”๋ฐ, ์ด๋Š” ๊ฐ๊ฐ์˜ ์•ž์ž๋ฆฌ 5๊ฐœ๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.

์•ž์ž๋ฆฌ๊ฐ€ 1์ด๋ฉด 1 ~ 24๋ฒˆ์งธ, ์•ž์ž๋ฆฌ๊ฐ€ 2์ด๋ฉด 25 ~ 48๋ฒˆ์งธ, ์•ž์ž๋ฆฌ๊ฐ€ 3์ด๋ฉด 49 ~ 72๋ฒˆ์งธ ... ์ด๋‹ค.

 

K = 35์ด๋ฉด 25~48์ด๋ฏ€๋กœ ์•ž์ž๋ฆฌ๊ฐ€ 2๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ์Šคํ…์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด n = 4, k = 35 - 24 = 11์ด๋‹ค. ์ฆ‰, ๋งจ 2 ์ด์ „์˜ ์ˆซ์ž์ธ 1์ด ๋งจ ์•ž์ž๋ฆฌ์— ์˜ค๋Š” ๊ฒฝ์šฐ๋Š” 24๊ฐ€์ง€๋ฅผ ์ „๋ถ€ ์ง€๋‚˜์น˜๊ณ  2๊ฐ€ ๋งจ ์•ž์ผ ๋•Œ 11๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ

N = 4, K = 11 ์ผ ๋•Œ๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋œ๋‹ค.

์ด ๊ณผ์ •์„ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ’๋“ค์„ ๋ฝ‘์•„๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ

์˜ˆ์‹œ์—์„  2 3 5 1 ๊นŒ์ง€ ๋ณด์ธ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๋Š” ์ˆซ์ž๊ฐ€ ํ•˜๋‚˜ ๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋•Œ๋งŒ ๋‚จ์€ ์ˆซ์ž๋ฅผ ์ฑ„์›Œ์ฃผ๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ์‹œ์ผฐ๋‹ค.

๋‹ต์€ 2 3 5 1 4 ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

๋‹ค์Œ์€ ์†Œ๋ฌธ์ œ2์ผ ๋•Œ์˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

์ˆœ์—ด์ด ์ฃผ์–ด์ง€๋ฉด ๊ทธ๊ฒŒ ๋ช‡ ๋ฒˆ์งธ ์ˆœ์—ด์ธ์ง€ ์•Œ์•„๋‚ด์•ผ ํ•œ๋‹ค.

N = 5, K = 2, 3, 5, 1, 4 ์ผ ๋•Œ

N = 5, 5! = 120, 120 / N = 24์ด๋‹ค. 

๋งจ ์•ž์ž๋ฆฌ๊ฐ€ 2์ด๋ฏ€๋กœ 25 ~ 48 ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. +24

๊ทธ ๋‹ค์Œ 3์ด๋ฏ€๋กœ ๋‹ค์Œ 7 ~ 12 ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. +6

๊ทธ ๋‹ค์Œ 5์ด๋ฏ€๋กœ ๋‹ค์Œ 5 ~ 6 ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. +4

๊ทธ ๋‹ค์Œ 1์ด๋ฏ€๋กœ ๋‹ค์Œ 1 ~ 1 ์— ํฌํ•จ๋˜์–ด ์žˆ๋”ฐ. + 1

๋งˆ์ง€๋ง‰ 4๋Š” ์ž๋™์œผ๋กœ ๊ฒฐ์ • ๋˜๋ฏ€๋กœ ์œ„์˜ ์ˆซ์ž๋“ค์„ ๋”ํ•˜๋ฉด 35๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค!

 

๐Ÿ’จ ์ˆ˜ํ•™๋ฌธ์ œ๋Š” ์†์œผ๋กœ ํ’€์–ด๋ณด๊ณ  ๊ทœ์น™์„ ์ฐพ์•„๋ณด๋Š”๊ฒŒ ์ข‹๋‹ค.

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

import math


def find_one(n, k):
    if len(answer) == N - 1:
        answer.append(numbers[-1])
        return

    numberOfCases = math.factorial(n) // n
    sequence = math.ceil(k / numberOfCases)
    answer.append(numbers.pop(sequence))

    find_one(n-1, k-(numberOfCases*(sequence-1)))


def find_k():
    n = N
    for num in K:
        numberOfCases = math.factorial(n) // n
        idx = numbers.index(num)
        if len(numbers) == 2:
            idx += 1
            answer.append(numberOfCases*idx)
            return
        numbers.pop(idx)
        answer.append(numberOfCases*idx)
        n -= 1


if __name__ == "__main__":
    N = int(input())
    tmp_input = list(map(int, input().split()))
    order = tmp_input.pop(0)

    # ์†Œ๋ฌธ์ œ 1
    if order == 1:
        K = tmp_input[0]
        numbers = [x for x in range(N+1)]
        answer = []
        find_one(N,K)
        print(' '.join(list(map(str, answer))))

    # ์†Œ๋ฌธ์ œ 2
    else:
        K = tmp_input
        numbers = [x for x in range(1, N+1)]
        answer = []
        find_k()
        print(sum(answer))
        
        
        

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: https://www.acmicpc.net/problem/1722

 

1722๋ฒˆ: ์ˆœ์—ด์˜ ์ˆœ์„œ

์ฒซ์งธ ์ค„์— N(1≤N≤20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์˜ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋Š” ์†Œ๋ฌธ์ œ ๋ฒˆํ˜ธ์ด๋‹ค. 1์ธ ๊ฒฝ์šฐ k(1≤k≤N!)๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , 2์ธ ๊ฒฝ์šฐ ์ž„์˜์˜ ์ˆœ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” N๊ฐœ์˜ ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. N๊ฐœ์˜ ์ˆ˜์—๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€๏ฟฝ๏ฟฝ

www.acmicpc.net




๋ฌธ์ œ

1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ž„์˜๋กœ ๋ฐฐ์—ดํ•œ ์ˆœ์—ด์€ ์ด N! = N×(N-1)×…×2×1 ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์ž„์˜์˜ ์ˆœ์—ด์€ ์ •๋ ฌ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด  N=3์ธ ๊ฒฝ์šฐ {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}์˜ ์ˆœ์„œ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ์ž‘์€ ๊ฒƒ์ด ์ˆœ์„œ์ƒ์—์„œ ์•ž์„œ๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๋‘ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ์ž‘์€ ๊ฒƒ์ด, ๋‘ ๋ฒˆ์งธ ์ˆ˜๋„ ๊ฐ™์œผ๋ฉด ์„ธ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ์ž‘์€ ๊ฒƒ์ด….

N์ด ์ฃผ์–ด์ง€๋ฉด, ์•„๋ž˜์˜ ๋‘ ์†Œ๋ฌธ์ œ ์ค‘์— ํ•˜๋‚˜๋ฅผ ํ’€์–ด์•ผ ํ•œ๋‹ค. k๊ฐ€ ์ฃผ์–ด์ง€๋ฉด k๋ฒˆ์งธ ์ˆœ์—ด์„ ๊ตฌํ•˜๊ณ , ์ž„์˜์˜ ์ˆœ์—ด์ด ์ฃผ์–ด์ง€๋ฉด ์ด ์ˆœ์—ด์ด ๋ช‡ ๋ฒˆ์งธ ์ˆœ์—ด์ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1≤N≤20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์˜ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋Š” ์†Œ๋ฌธ์ œ ๋ฒˆํ˜ธ์ด๋‹ค. 1์ธ ๊ฒฝ์šฐ k(1≤k≤N!)๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , 2์ธ ๊ฒฝ์šฐ ์ž„์˜์˜ ์ˆœ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” N๊ฐœ์˜ ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. N๊ฐœ์˜ ์ˆ˜์—๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ •์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‚˜ํƒ€๋‚œ๋‹ค.

์ถœ๋ ฅ

k๋ฒˆ์งธ ์ˆ˜์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” N๊ฐœ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜, ๋ช‡ ๋ฒˆ์งธ ์ˆ˜์—ด์ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•