스터디/알고리즘

[hard] 629. K Inverse Pairs Array

졔부작 2022. 7. 17. 18:32
728x90
반응형

문제

https://leetcode.com/problems/k-inverse-pairs-array/

 

K Inverse Pairs Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


풀이방법

숫자제한을 보니 제일 먼저 떠오르는 브루트포스로 풀면 시간초과가 날 수 밖에 없는 문제라서 DP로 접근해야겠다고 생각했다

그런데 DP 규칙을 어떻게 만들어야하는지... 역시 hard...

그래서 https://leetcode.com/problems/k-inverse-pairs-array/discuss/1282998/Python%3A-Explained-Bottom-Up-DP 참고했다

"j >= i, along with doing dp[i][j] = dp[i-1][j] + dp[i][j-1] we also subtract dp[i-1][j-i] for the invalid shifting case" 이 부분이 사실 아직도 잘 이해가 안간다...

반응형

코드

### DP ###
class Solution:
    def kInversePairs(self, n: int, k: int) -> int:
        dp = [[0]*(k+1) for _ in range(n+1)]
        
        for i in range(1,n+1):
            dp[i][0] = 1
            
        for i in range(1,n+1):
            for j in range(1,k+1):
                if i==1 and j==1:
                    continue
                elif j > i*(i-1)//2:
                    dp[i][j] = 0
                elif j == i*(i-1)//2:
                    dp[i][j] = 1
                else:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
                    if j >= i:
                        dp[i][j] -= dp[i-1][j-i]
        
        return dp[n][k] % (10**9 + 7)
### 브루트포스: 시간초과 ###
class Solution:
    def kInversePairs(self, n: int, k: int) -> int:
        
        def dfs(curarr,revcnt):
            if revcnt > k:
                return 0
            if len(curarr) == n:
                if revcnt == k:
                    return 1
                else:
                    return 0
                
            result = 0
            for i in range(1,n+1):
                flag = True
                newrevcnt = revcnt
                for j in curarr:
                    if i == j:
                        flag = False
                        break
                    elif j > i:
                        newrevcnt += 1
                if flag:
                    result += dfs(curarr[:]+[i],newrevcnt)
                    
            return result

		return dfs([],0) % (10**9 + 7)

 

728x90
반응형