본문 바로가기

TIL

[240315] 파이썬: 코드카타 42 & SQL: 코드카타 146~148

[파이썬 코드카타]

삼총사

https://school.programmers.co.kr/learn/courses/30/lessons/131705

 

1) 어떤 문제가 있었나 

- 각 정수 번호를 가지고 있는 학생 3명의 번호를 더 했을 때 0이 되면 삼총사

- 각 정수 배열에서 삼총사를 만들 수 있는 경우의 수를 반환하는 문제 

 

number = [-2, 3, 0, 2, -5]

result = 2

 

2) 내가 시도해본 건 무엇인가

구글링을 통해서 경우의 수를 뽑아주는 라이브러리 itertools의 존재를 확인 

프로그래머스에서 라이브러리 활용이 가능한지 몰라서 우선 함수를 작성해서 시도해봄 

 

3) 어떻게 해결했나

itertools 라이브러리 활용해서 간단히 해결 

def solution(number):
    from itertools import combinations  #순서 상관 없는 경우의 수 나열 
    answer = 0
    three_number = list(combinations(number, 3))

    for i in three_number:
        if sum(i) == 0: 
            answer += 1
    return answer

 

4) 무엇을 새롭게 알았나
- itertools 라이브러리의 존재와 세부 활용법

- combinations는 순서를 고려하지 않고, permutation 은 순서를 고려 > 중복 여부에 따라 함수가 또 나뉨

itertools 라이브러리 함수 순서 중복 비고
permutations O X  
combinations X X  
product O O 파라미터 repeat 활용 
combinations_with_replacement X O  

 

# 라이브러리 불러오기 및 데이터 변수 지정
from itertools import *
dataset = ['A', 'B', 'C']

 

① 순열(Permutation)

- 순서는 고려하나 중복은 없는 조합 

permutations_list = list(permutations(dataset, 2))

# 결과 
# [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

 

② 조합(Combination)

- 순서와 중복 모두 없는 조합 

combinations_list = list(combinations(dataset, 2))

# 결과 
# [('A', 'B'), ('A', 'C'), ('B', 'C')]

 

③ 중복 순열(Product) a.k.a Permutation with repetition

- 순서와 중복이 모두 있는 조합 

- repeat 파라미터를 통해 최대 중복 횟수를 조정할 수 있음  (ex. repeat = 3이면, ('A',' A',' A'), ('A', 'A', 'B')... )

product_list = list(product(dataset, repeat = 2))

# 결과 
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

 

④ 중복 조합(Combination with repetition)

- 순서를 고려하지 않으나 중복은 포함하는 조합 

combinations_repeat_list = list(combinations_with_replacement(dataset, 2))

# 결과 
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]