가능한 모든 두개의 묶음 쌍 구하는 방법 있을까요?

조회수 653회

간단한 예제를 하나 들겠습니다.

A={1,2,3,4} 이 있을 때 가능한 모든 두 묶음을 구하는 코드를 만들고 싶습니다.
위의 숫자에 대한 답은

(1,2)(3,4)  :   {1,2,3,4}  과 (1,3)(2,4) :    {1,3,2,4}

B=[1,2,3,4,5,6]으로 확장하면

(1,2)(3,4)(5,6)
(1,2)(3,5)(4,6)
(1,3)(2,4)(5,6)
(1,3)(2,5)(4,6)
(1,4)(2,3)(5,6)
(1,4)(2,6)(3,5)
(1,5)(2,3)(4,6)
(1,5)(2,4)(3,6)
(1,6)(2,3)(4,5)
(1,6)(2,4)(3,5)

이 되겠네요.

python이나 matlab으로 어떻게 구현가능할까요?

1 답변

  • >>> def get_pairs(s, depth=0):
        # print('>'*depth, s)
        # depth+=1
        if len(s) == 2:
            #print(s)
            yield (tuple(s),)
        for i in range(1, len(s)):
            pair = (s[0], s[i])
            s_pair = s[1:]
            s_pair.remove(s[i])
            for pairs in get_pairs(s_pair):
                #print(pair, pairs)
                yield (pair, *pairs)
    
    
    >>> r = [ p for p in get_pairs(s) ]
    >>> from pprint import pprint
    >>> pprint(r)
    [((1, 2), (3, 4), (5, 6)),
     ((1, 2), (3, 5), (4, 6)),
     ((1, 2), (3, 6), (4, 5)),
     ((1, 3), (2, 4), (5, 6)),
     ((1, 3), (2, 5), (4, 6)),
     ((1, 3), (2, 6), (4, 5)),
     ((1, 4), (2, 3), (5, 6)),
     ((1, 4), (2, 5), (3, 6)),
     ((1, 4), (2, 6), (3, 5)),
     ((1, 5), (2, 3), (4, 6)),
     ((1, 5), (2, 4), (3, 6)),
     ((1, 5), (2, 6), (3, 4)),
     ((1, 6), (2, 3), (4, 5)),
     ((1, 6), (2, 4), (3, 5)),
     ((1, 6), (2, 5), (3, 4))]
    
    >>> pprint(list(get_pairs([1,2,3,4])))
    [((1, 2), (3, 4)), ((1, 3), (2, 4)), ((1, 4), (2, 3))]
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)