[프로그래머스] Lv1.삼총사

싱숭생숭어·2023년 4월 16일

프로그래머스

목록 보기
1/21

문제

문제 설명

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

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

제한사항

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

입출력 예

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

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

풀이과정

-> 위 문제를 for문 3번과 number list slicing으로 풀었을 경우, 테스트 케이스 1번과 6번에서 실패가 발생한다. 나머지는 정상 통과함.

그래서 다른 방식으로 문제를 풀이함 (위 테스트 케이스에서 왜 오류가 뜨는지는 아직 모르겠음 ;;;)

<오류를 찾았다 !!!>

만약 number = [1, 1, 1, -2, 0]
이런식으로 list안에 중복되는 값이 존재할 경우,
for y in number[number.index(x)+1:] -> 위 구문에서 index(1)의 값이 언제나 0(x=1일때 맨 먼저 존재하는 1의 index값으로 고정)으로 들어간다.
따라서 순차적으로 y의 범위가 바뀌며 for문이 실행되는 것이 아니라서 실패가 뜨는 것이었다 !!!

위 방식은 range로 for문의 범위를 설정하고 if문에서 number의 원소를 빼와 계산하는 방식으로 풀었다. 이 경우는 또 오류가 발생하지 않고 정상 실행함 !!

위에 구문이 왜 오류가 뜨는지는 차차 생각해봐야지 ㅠ.ㅠ

내 풀이

def solution(number):
    answer = 0
    for x in range(0, len(number)-2):
        for y in range(x+1, len(number)-1):
            for z in range(y+1, len(number)):
                if number[x]+number[y]+number[z] == 0:
                    answer += 1 
    return answer

다른 풀이(참고)

from itertools import combinations
#combinations는 리스트에서 개수에 맞는 조합을 반환해줌
def solution (number) :
    answer = 0
    for i in combinations(number,3) :
        if sum(i) == 0 :
            answer += 1
#numbers에서 3개의 조합을 추출했을때, 숫자의 합이 0일 경우 answer을 1씩 더한다
    return answer
profile
공부합시당

0개의 댓글