-
๋ฐฑ์ค 6603 ๋ก๋ (์ฌ๊ท๋ก ๋ถ๋ถ์งํฉ/์์ด/์กฐํฉ ๊ตฌํ ์ฐ์ต)๐ Algorithms 2023. 2. 20. 15:08
Algorithms & Data structures
๐ ์คํฐ๋ ์ ๋ณด
graceful-canary-e9f.notion.site
(๋ฌธ์ ์ด์ธ์ ์ฌ๊ท ๊ธฐ๋ฒ์ผ๋ก ๋ฐฐ์ด์ ๋ชจ๋ ๋ถ๋ถ์งํฉ ๊ตฌํ๊ธฐ / ์์ด ๊ตฌํ๊ธฐ / ์กฐํฉ์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ํ๋จ์ ์์ฑํด๋ณด์์ต๋๋ค)
๐ก ์ฌ๊ท ํ!
์๋ฃ๋๋ ์์ ์ ๊ผญ ๋ช ์ํด์ฃผ๊ธฐ
ํธ๋ฆฌ๊ตฌ์กฐ ๊ทธ๋ ค๋ณด๋ฉด ํจํด์ด ๋ ๊ฐ์์ ์ผ๋ก ๋ณด์๐ ๋ฌธ์
๋ก๋ ๋ฝ๊ธฐ ๋ฌธ์ .
- ์ซ์ {1, 2, ..., 49} ์ค 6๊ฐ๋ฅผ ๊ณ ๋ฆ
- ๋ก๋ ๋ฒํธ๋ฅผ ์ ํ ์ ์ฌ์ฉ๋๋ ๊ฐ์ฅ ์ ๋ช ํ ์ ๋ต์ 49๊ฐ์ง ์ ์ค k(k>6)๊ฐ์ ์๋ฅผ ๊ณจ๋ผ → ์งํฉ S๋ฅผ ๋ง๋ ๋ค์ → ๊ทธ ์๋ง ๊ฐ์ง๊ณ ๋ฒํธ๋ฅผ ์ ํํ๋ ๊ฒ์ด๋ค.
- ์์) k=8, S={1,2,3,5,8,13,21,34}์ธ ๊ฒฝ์ฐ ์ด ์งํฉ S์์ ์๋ฅผ ๊ณ ๋ฅผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ ์ด 28๊ฐ์ง์ด๋ค. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])
- ์งํฉ S์ k๊ฐ ์ฃผ์ด์ก์ ๋, ์๋ฅผ ๊ณ ๋ฅด๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
k๊ฐ์ ์ ์ค์์ 6๊ฐ ์๋ฅผ ๊ตฌํ๋๋ก : ์กฐํฉ๋ฌธ์
๐ ํ์ด
(์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฏธ์ฌ์ฉ ์กฐํฉ ์ง์ ๊ตฌํ)
def combinations(nums, k, ans=[]): if len(ans) == k: res.append(ans) return for num in nums: newAns = ans + [num] newNums = [x for x in nums if x > num] combinations(newNums, k, newAns) res = [] # ๋ชจ๋ ์กฐํฉ์ด ๋ด๊ธฐ๋ ๋ถ๋ถ. ์ ์ญ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ด๊ณณ์ ์์น. while True: nums = list(map(int, input().split())) if len(nums) == 1: break k = nums[0] s = nums[1:] combinations(s, 6, []) for subset in res: print(*subset) res = [] # ํ ์คํธ ์ผ์ด์ค ํ๋ฒ ์คํ ์ ์ด๊ธฐํ print()
(์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ)
from itertools import combinations while True: nums = list(map(int, input().split())) if not len(nums): break k = nums[0] s = nums[1:] subsets = sorted(list(combinations(s, 6))) for subset in subsets: print(*subset) print()
๐ [์ถ๊ฐ๊ณต๋ถ] ์ฌ๊ท๋ก ๋ถ๋ถ ์งํฉ ๊ตฌํ๊ธฐ
๐ก์์ด๋์ด
[1,2,3]์ ๋ถ๋ถ์งํฉ์ ๊ตฌํ ๋, ๊ฐ ์์๋ฅผ ์ํํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ์ด๊ธฐํ
- [[]]
- 1์ผ ๋, ์ด์ ์กฐํฉ์ iterateํ๋ฉฐ 1์ ๋ํ ์กฐํฉ์ ์ถ๊ฐ.⇒ [[],[1]]
- [] + [1] = [1]
- 2์ผ ๋, ๊ฐ์ ๋ก์ง[1] + [2] = [1,2]
- ⇒ [[],[1],[2],[1,2]]
- [] + [2] = [2]
- 3์ผ ๋ ๊ฐ์ ๋ก์ง[1] + [3] = [1,3][1,2] + [3] = [1,2,3]
- ⇒ [[],[1],[2],[1,2], [3], [1,3], [2,3], [1,2,3]]
- [2] + [3] = [2,3]
- [] + [3] = [3]
์ฌ๊ท๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ์ ๋,
์ด์ ์กฐํฉ + ์ด์ ์กฐํฉ์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ์กฐํฉ์ ๋ฐํํ๋ ์ฌ๊ท ๋ก์ง์ ์งค ์ ์๊ฒ ๋ค.
def subsets(nums): if not nums: return [[]] old_subset = subsets(nums[:-1]) # ์ด์ ์กฐํฉ return old_subset + [num + [nums[-1]] for num in old_subset] # nums[-1] ์๋ก์ด ์์ subsets([1,2,3]) # [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
๐ ์ฌ๊ท๋ก ์์ด/์กฐํฉ ๋ง๋ค๊ธฐ
์ ๋ก์ง์ ํ์ฅํ์ฌ ์ฌ๊ท๋ก ์์ด/์กฐํฉ์ ๋ง๋ค ์ ์๋ค. ๋ก์ง์ ๋์ผํ๋ค. ๋ํ์ ์ผ๋ก [1,2,3,4,5] ์ค 3๊ฐ์ ์์๋ฅผ ๋ฝ๋ ์์ด, ์กฐํฉ์ ๊ตฌํ๋ค๊ณ ํด๋ณด์.
๋ฆฌ์คํธ ๋ด ์์ ๋ด ํ๋๋ฅผ ๋ฝ๊ณ → ๋ฝ์ ์์๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ฆฌ์คํธ ์ค ํ๋์ ์์๋ฅผ ๋ฝ๊ณ → ์ด ๊ณผ์ ์ ์์ 3๊ฐ๋ฅผ ๋ฝ์ ๋๊น์ง ๋ฐ๋ณต(์ฌ๊ท)ํ๋ค.
๋ชจ๋ ์กฐํฉ์ ๊ณ ๋ คํด์ผํ๊ธฐ์ [1,2,3,4,5] ์์๋ฅผ ๋ฐ๋ณตํ์ฌ ์ฒซ ์์๋ฅผ ๋ฝ๋๋ค.
์์ด์ ๊ฒฝ์ฐ >
def permutation(nums, k, ans=[]): """ nums: ๋ฐฐ์ด k: ๋ฝ์ ๊ฐ์ ans: ๋ฝ์ ์์ """ if len(ans) == k: res.append(ans) return for num in nums: newAns = ans + [num] newNums = [x for x in nums if x != num] combinations(newNums, k, newAns) res = [] # ์ ๋ด์ด ๋ด๊ธฐ๋ ๊ณณ combinations([1,2,3,4,5], 2, []) print(res) # [[1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4]]
์กฐํฉ์ ๊ฒฝ์ฐ >
์กฐํฉ์ ๊ฒฝ์ฐ, ์ ์ฒด์ ์ธ ๋ก์ง์ ๋์ผํ๋ค. ์ฐจ์ด์ ์ด ์๋ค๋ฉด ํ๋์ ์์๋ฅผ ๋ฝ๊ณ , ๊ทธ ๋ค์ ๊ทธ๊ฒ์ ์ ์ธํ ๋ ๋ค๋ฅธ ์์๋ฅผ ๋ฝ์ ๋ ์ด์ ๋ฝ์ ์์๋ณด๋ค ๋ ํฐ ์์ (ํน์ ๋ ํฐ ์์ ์์)๋ง ๋ฝ๋๋ก ํ์ฌ ํ๋ฐฉํฅ์ผ๋ก ๋ฝ๊ธฐ๋ฅผ ์ ํํ์ฌ [1,2]์ [2,1]๋ฅผ ๊ฐ์ ๊ฒฝ์ฐ๋ก ์ฌ๊ธฐ์ง ์์ ์ ์๋ค.
def combinations(nums, k, ans=[]): """ nums: ๋ฐฐ์ด k: ๋ฝ์ ๊ฐ์ ans: ๋ฝ์ ์์ """ if len(ans) == k: res.append(ans) return for num in nums: newAns = ans + [num] newNums = [x for x in nums if x > num] combinations(newNums, k, newAns) res = [] combinations([1,2,3,4,5], 2, []) print(res) # [[1, 2], [1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5], [4, 5]]
'๐ Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 10828 : ์คํ (+ํ์ด์ฌ์์ switch-case ๊ตฌํ) (0) 2023.02.20 ๋ฐฑ์ค 12605 : ๋จ์ด์์ ๋ค์ง๊ธฐ (print ์ฑ๋ฅ) (0) 2023.02.20