ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ฐฑ์ค€ 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. ์ดˆ๊ธฐํ™”
    2. [[]]
    3. 1์ผ ๋•Œ, ์ด์ „ ์กฐํ•ฉ์„ iterateํ•˜๋ฉฐ 1์„ ๋”ํ•œ ์กฐํ•ฉ์„ ์ถ”๊ฐ€.⇒ [[],[1]]
    4. [] + [1] = [1]
    5. 2์ผ ๋•Œ, ๊ฐ™์€ ๋กœ์ง[1] + [2] = [1,2]
    6. ⇒ [[],[1],[2],[1,2]]
    7. [] + [2] = [2]
    8. 3์ผ ๋•Œ ๊ฐ™์€ ๋กœ์ง[1] + [3] = [1,3][1,2] + [3] = [1,2,3]
    9. ⇒ [[],[1],[2],[1,2], [3], [1,3], [2,3], [1,2,3]]
    10. [2] + [3] = [2,3]
    11. [] + [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]]
    

     

Designed by Tistory.