목차

랜덤 소트

ps
링크acmicpc.net/…
출처BOJ
문제 번호1521
문제명랜덤 소트
레벨플래티넘 5
분류

DP

시간복잡도O(n^2 * n!)
인풋사이즈n<=8
사용한 언어Python 3.11
제출기록40988KB / 424ms
최고기록424ms
해결날짜2023/07/15

풀이

코드

"""Solution code for "BOJ 1521. 랜덤 소트".

- Problem link: https://www.acmicpc.net/problem/1521
- Solution link: http://www.teferi.net/ps/problems/boj/1521

Tags: [dp]
"""

import functools


@functools.cache
def solve_rec(nums):
    l = list(nums)
    count = 0
    tot_swap = 0.0
    for i, nums_i in enumerate(nums):
        for j in range(i + 1, len(nums)):
            if nums_i > nums[j]:
                count += 1
                l[j], l[i] = l[i], l[j]
                tot_swap += 1 + solve_rec(tuple(l))
                l[j], l[i] = l[i], l[j]

    return tot_swap / count if count > 0 else 0.0


def main():
    N = int(input())  # pylint: disable=unused-variable
    nums = [int(x) for x in input().split()]

    print(solve_rec(tuple(nums)))


if __name__ == '__main__':
    main()