반응형
문자열이 주어졌을 때 모든 경우의 순열을 계산하는 메서드를 작성하라. 문자는 중복되어 나타날 수 있지만, 나열된 순열은 서로 중복되면 안 된다.
이 문제에서는 중복된 순열을 어떻게 찾아낼 것인가에 대하여 생각해보아야 한다.
단순히 모든 순열을 구한 후에 배열에 이 순열이 존재하지않으면 추가하는 방법으로 해결할 수 있다. 하지만 이 해결책은 최악의 경우 시간이 소요될 것이다.
그럼, 어떻게 접근해야할까?
먼저 작은 문제로 쪼개서 생각해보자.
'abca'라는 문자열이 주어졌다. 이 문자열의 순열을 구하려면 어떻게 해야할까?
중복 없는 순열을 풀때와 같이 문자열의 한 문자와 나머지 문자열의 순열을 구하고 이를 모두 합치면 된다.
수식으로 표현해보자면 다음과 같다.
하지만, 중복이 있는 문자열의 경우라면 빨간색으로 표시한 부분처럼 중복된 순열이 나타나게 될 것이다.
그럼 이 중복된 순열을 어떻게 처리해야할까?
hashset 을 사용하여 해당 문자가 이미 사용된 문자인지 아닌지 판별하면 되지않을까?
이 알고리즘을 코드로 표현해보면 다음과 같다.
중복된 문자가 많으면 많을수록 실행 시간은 줄어들 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution: def helper(self, nums, start=0) : if start == len(nums)-1 : self.ans.append(nums[:]) return used = set() for i in range(start, len(nums)) : if nums[i] not in used : used.add(nums[i]) nums[i], nums[start] = nums[start], nums[i] self.helper(nums, start+1) nums[i], nums[start] = nums[start], nums[i] def permuteUnique(self, nums: List[int]) -> List[List[int]]: if not nums : return [] self.ans = [] self.helper(nums) return self.ans | cs |
문제 :
https://leetcode.com/problems/permutations-ii
반응형
'0 > algorithm' 카테고리의 다른 글
N-Queens (0) | 2019.03.26 |
---|---|
Coin Change (DP) (0) | 2019.03.23 |
중복 없는 순열 (0) | 2019.03.17 |
Topological Sorting (위상 정렬) (0) | 2019.03.10 |
How to approach most of DP problems (House Robber) (0) | 2019.02.14 |