๐ ๋ชฉ์ฐจ
๋ฐฑํธ๋ ํน์ ๋ํ์ ์ธ ๋ฌธ์ ์ธ permutation๊ณผ subset์ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
๐ค ๋ฌธ์ 1 : Permutations
๋ฌธ์ : https://leetcode.com/problems/permutations/
์ฃผ์ด์ง ๋ฆฌ์คํธ๋ก ์์๋ฅผ ์กฐํฉํ์ฌ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๋ฆฌ์คํธ์ ๋ง๋ค์ด ๋ฐํํ๋ ๋ฌธ์ ์ ๋๋ค.
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ret = []
def getPermutation(current_array, item_list):
ret.append(current_array)
if not item_list: return
for idx in range(len(item_list)):
getPermutation(current_array+[item_list[idx]], (item_list[idx+1:]))
getPermutation([], nums)
return ret
๐ก ํ์ด
1. Backtracking
from typing import List
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
ret = []
def getPermutation(current_array, item_list):
if not item_list: ret.append(current_array)
for idx in range(len(item_list)):
getPermutation(current_array+[item_list[idx]], (item_list[:idx] if idx != 0 else [])+(item_list[idx+1:]))
getPermutation([], nums)
return ret
current_array ์๋ ํ์ฌ๊น์ง ๋ง๋ ๋ฆฌ์คํธ๋ฅผ, item_list์๋ ์์ผ๋ก ๋ฆฌ์คํธ์ ๋ฃ์ด์ผ ํ ์์ดํ ๋ค์ ์ ๋ฌํฉ๋๋ค.
๋ด๋ถ์์ getPermutation์ ๊ณ์ ํธ์ถํ๋ ๊ตฌ์กฐ์ด๊ณ , getPermutation ์์ฒด๊ฐ ํ๋์ for loop์ ๊ฐ๊ณ ์์ด์
์ ์ฒด ์ผ์ด์ค์ ๋ํด์ ๋ค ํ๋ฒ์ฉ ๋ณด๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(n!)์ด๊ฒ ๋ค์
๐ค ๋ฌธ์ 2 : Subsets
๋ฌธ์ : https://leetcode.com/problems/subsets/
์ฃผ์ด์ง ๋ฆฌ์คํธ์ ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์ ๊ทผ๋ฐฉ์์ Permutation๊ณผ์ ์ฌํ์ง๋ง 1. ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ , 2. ๋ฆฌ์คํธ์ ์์ดํ ์ด n๊ฐ๊ฐ ์๋์ด๋ ๋ฉ๋๋ค.
๐ก ํ์ด
1. Permutations ๊ธฐ๋ฐ์ ํ์ด
์ฒ์์๋ Permutations ๋ฌธ์ ์์ ์กฐ๊ธ๋ง ๋ณํํ๋ฉด ๋ ๊ฒ ๊ฐ์์ ์๋์ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
๋ชจ๋ ์์ดํ ์ ๋ค ๋ฃ์ ํ์๋ ์์ผ๋ item_list์ ์ด๋ฏธ ์ง๋๊ฐ ์์ดํ ์ ํฌํจํ์ง ์์ต๋๋ค.
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ret = []
def getPermutation(current_array, item_list):
ret.append(current_array)
if not item_list: return
for idx in range(len(item_list)):
getPermutation(current_array+[item_list[idx]], (item_list[idx+1:]))
getPermutation([], nums)
return ret
2. One-liner ํ์ด
ํ์ด์ฌ์ด๋ผ๋ ์ธ์ด ํน์ฑ ์ ๋ฌธ์ ๊ฐ ๋ณต์กํด๋ณด์ฌ๋ ํ์ค์ง๋ฆฌ ํ์ด(?) ๊ฐ ๋์ค๋ ๋ฌธ์ ๋ค์ด ์์ต๋๋ค.
์๋ ํ์ด๋ nums์ ์ด์ดํ ์ ๋๋ฉด์ ์ ์ฒด ๋ฐฐ์ด์ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
์๋ฅผ๋ค์ด ์ฃผ์ด์ง nums : [1,2,3] ์ด์๋ค๋ฉด
for ๋ฌธ์ ๋ ๋ ๋ง๋ค ์๋์ ๊ฐ์ด ๋ฐ๋๊ฒ ๋ค์
[[]]
[[], [1]]
[[], [1], [2], [1, 2]]
[[], [1], [2], [1, 2], [3], [1,3], [2,3], [1,2,3]
์๋ก ์ถ๊ฐ๋ ์์ดํ ์ ๋ณผ๋๋ก ํ์ํ๋๋ฐ, ๋ณด๋ฉด ์๋ ์๋ ๋ฐฐ์ด์ item๊ฐ์ ์ถ๊ฐํ ํํ์ ๋๋ค.
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
if not nums: return [[]]
ret = [[]]
for item in nums: ret += [current + [item] for current in ret]
return ret
'์๊ณ ๋ฆฌ์ฆ > LEETCODE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Search for a Range | LeetCode 802 | Python3 ๐ (0) | 2022.03.09 |
---|---|
Sort Colors | LeetCode 798 | Python3 ๐ (0) | 2022.03.06 |
Generate Parentheses | LeetCode 780 | Python3 ๐ (0) | 2022.03.02 |
Letter Combinations of a Phone Number | LeetCode 793 | Python3 ๐ (0) | 2022.03.01 |
Longest Palindromic Substring | LeetCode 780 | Python3 ๐ (0) | 2022.02.28 |