파이썬 연산자 *

·2024년 6월 6일
0

파이썬

목록 보기
18/18

https://school.programmers.co.kr/learn/courses/30/lessons/258709?language=python3
이 문제를 풀던 도중 새로 알게 된 연산자이다.

뽑은 주사위로 나올 수 있는 합의 경우의 수를 구하기 위해 카타시안 곱이 필요했는데, 이때 itertools 라이브러리의 product 를 사용했다. 그런데 처음 product() 를 사용했을 때 product(array) 로 넣자

from itertools import product

arrays = [
    [1, 2, 3],
    [4, 5],
    [6, 7]
]

print("\nUsing product(arrays):")
for i in product(arrays):
    print(i)

아래와 같은 결과가 나왔다.

([1, 2, 3],)
([4, 5],)
([6, 7],)

원하는 결과가 나오지 않아 왜인지 검색해봤는데, 언패킹 연산자인 *을 사용하지 않았기 때문이라고 한다. 즉, [1,2,3], [4,5], [6,7] 을 각각의 배열이 아닌, 한 배열의 구성 요소라고 인식했기 때문에 배열 하나를 카타시안 곱한 결과가 나온 것이다. 쉽게 말해 [1,2,3] 을 카타시안 곱하면 [1], [2], [3] 이 나오는데, 이러한 원리로 위의 결과가 나온 것이다.

따라서 각 배열에서 한 숫자씩 뽑아 다른 배열과 하나씩 조합하는, 내가 원하는 결과를 만들기 위해서는 2차 배열을 언패킹 해줘야 하는데, 이때 쓰이는 연산자가 * 라는 것이다.

*arrays 로 쓴다면 [1,2,3], [4,5], [6,7] 이 각각 다른 요소로 인식되어 아래와 같이 각 배열을 곱한 결과가 나온다.

from itertools import product

arrays = [
    [1, 2, 3],
    [4, 5],
    [6, 7]
]

print("Using product(*arrays):")
for i in product(*arrays):
    print(i)
(1, 4, 6)
(1, 4, 7)
(1, 5, 6)
(1, 5, 7)
(2, 4, 6)
(2, 4, 7)
(2, 5, 6)
(2, 5, 7)
(3, 4, 6)
(3, 4, 7)
(3, 5, 6)
(3, 5, 7)

문제는 카타시안 곱만 해결하면 쉬웠다. 나올 수 있는 경우의 수를 모두 구해준 뒤 해당 배열들의 합을 딕셔너리에 {합: 합이 나온 경우의 수} 의 형태로 저장해주었다. 이후 남은 주사위에 대해서도 똑같이 처리해준 뒤 for 문을 통해 a가 가져간 주사위의 합과 b가 가져간 주사위를 대조하여 a > b 인 경우 (a의 경우의 수)*(b의 경우의 수) 를 win이라는 변수에 더했다. 이때 win 이 이전의 win_max 보다 크다면 win_max 를 교체하고 answer 에 해당 주사위 조합을 넣었다.

위의 과정을 a가 가져갈 수 있는 주사위의 조합이 끝날 때까지 반복했다.

profile
공부 중

0개의 댓글