프로그래머스 – 삼총사 Python

프로그래머스 문제풀이

문제

문제설명

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

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

제한사항

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

입출력 예

numberresult
[-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

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

문제해결과정

  1. 각 학생은 각자 정수번호를 갖고 있다.
  2. 총 학생 정수번호 리스트에서 3명을 추출하여 더했을때 결과값이 0이 되는 경우를 카운트한다.
  3. 제한사항을 통해 학생수는 3명이상 13명이하임을 고려한다.
  4. 학생 정수번호의 범위는 -1000이상 1000이하임을 고려한다.
  5. 각 학생의 정수번호는 같을 수 있음을 고려한다.

위 같은 문제 및 제한사항을 해석하고 문제풀이를 시작하면 되는데 저 같은 경우에는 itertools모듈의 combinations 함수를 알고 있었어서 쉽게 해결할 수 있었어요.

아래 파이썬 레퍼런스 사이트에서 다양한 레퍼런스를 찾아보실 수 있습니다.

나의 풀이

from itertools import combinations #itertools내 combinations함수를 사용하겠다.
def solution(number):
    return list(map(sum,list(combinations(number,3)))).count(0)

저는 위처럼 나름 파이써닉하게 풀어봤는데 설명을 살짝 드리자면,
combinations(number,3)함수는 수학에서 조합(mCn)을 함수화 해놓은 내장함수예요. 의미는 학생번호 리스트에서 3명을 추출하겠다는 의미고요.

반환될때 추출값들이 튜플형태로 반환되므로 list(combinations(number,3))를 통해서 리스트 형태로 변환해줬어요.

그리고 추출된 3명의 값이 합산될 수 있도록 sum함수로 더해주는데 반환이 여러번 되므로 map함수를 같이 사용하여 map(sum,list(combinations(number,3)))를 통해서 반환될때마다 sum함수로 더해주도록 했어요.

더해진 값들이 여러개이므로 list(map(sum,list(combinations(number,3))))와 같이 또 list로 감싸줬고요.

마지막으로 list(map(sum,list(combinations(number,3)))).count(0)을 통해서 세 학생의 정수 합산 값이 0인 결과의 수를 카운트해서 값을 return해주도록 코딩해보았습니다.

다른 사람의 풀이

해당 문제가 출제된지 얼마되지않아 제 코드와 같은 코드가 가장 간략해보여서 참고 풀이 소스는 생략했어요.