데이터 꿈나무

[코딩 테스트] 프로그래머스_삼총사_리스트에서 추출하여 더하기(Python) 본문

Activity/Algorithm

[코딩 테스트] 프로그래머스_삼총사_리스트에서 추출하여 더하기(Python)

ye_ju 2023. 2. 9. 00:08

문제설명

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

제한사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

입출력 예

number result
[-2, 3, 0, 2, -5] 2
[-3, -2, -1, 0, 1, 2, 3] 5
[-1, 1, -1, 1] 0

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

입출력 예 #3

  • 삼총사가 될 수 있는 방법이 없습니다.

 

코드를 설명하기 전에 우선 map함수와 combinations 함수에 대해서 개념을 간단히 짚고 갈게요!

 

※ map함수란?

map(funtion, iterable)

첫 번째 매개변수로는 함수가 오고, 두 번째 매개면수로는 반복 가능한 자료형(리스트, 튜플 등)이 옵니다.

map 함수의 반환 값은 map 객체이기 때문에 해당 자료형을 list 혹은 tuple로 형변환을 시켜주어야 합니다.

 

함수의 동작은 두 번째 인자로 들어온 반복 가능한 자료형을 첫 번째 인자로 들어온 함수에 하나씩 집어넣어서 함수를 수행하는 함수입니다.

 

만약에 map함수를 사용하지 않으면 반복문(ex. for반복문)을 이용해서 하나하나 리스트 요소에 접근한 후, 하나씩 계산을 해주어야 하는 번거로움이 있습니다.

 

※ combinations함수란?

Python에는 순열과 조합을 손쉽게 만들어주는 모듈 itertools가 있습니다.

combinations(객체, r)

반복가능한 객체(리스트, 튜플, 문자열) 안에서 r개를 선택합니다.

사용하기 전에 from itertools import combinations 를 선언해주어야 합니다.

 

객체가 되며, 경우의 수에 대한 쌍을 튜플형식으로 반환해줍니다.

 

예시)

from itertools import combinations

arr = ['a','b','c']
for i in combinations(arr, 2):
	print(i)
    
### 실행 결과 ###
('a','b')
('a','c')
('b','c')

코드

from itertools import combinations

def solution(number):
	return list(map(sum, combinations(number, 3))).count(0)

1. 조합을 함수화 해놓은 내장함수인 combinations를 이용합니다. number 리스트에서 3명을 추출하겠다는 의미입니다.

2. 추출된 3명의 값이 합산될 수 있도록 sum 함수로 더해주는데 반환이 여러번 되기 때문에 map 함수를 같이 사용하여 반환될 때마다 sum함수로 더해주도록 해주었습니다.

3. 더해진 값들이 여러 개 이므로 list로 감싸주었습니다.

4. 마지막 count(0)을 통해 더해진 세 개의 값이 0인 개수를 카운트해서 값을 return해주도록 해주었습니다.

Comments