코딩 테스트 연습/[프로그래머스] Python

[LV.3] 연습문제 > 삼총사 ⭐️

duswjd_data 2025. 7. 1. 09:56

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • 주어진 학생들의 번호 중에서 3명의 학생을 고를 수 있는 방법을 찾아, 그들의 번호의 합이 0이 되는 경우의 수를 구하는 문제
  • 제한사항
    3 ≤ number의 길이 ≤ 13
    -1,000 ≤ number의 각 원소 ≤ 1,000
    서로 다른 학생의 정수 번호가 같을 수 있음

문제 예시

학생들의 정수 번호 쌍 (-2, 0, 2), (3, 2, -5)이 삼총사가 될 수 있으므로, 2를 반환


정답 코드

  • 3개의 값을 고르는 문제 → 3중 반복문 사용
  • 중복을 피해야 한다는 점 기억하기
def solution(number):
    answer = 0
    n = len(number)
    
    for i in range(n-2):
        for j in range(i+1, n-1):
            for k in range(j+1, n):
                if number[i]+number[j]+number[k] == 0:
                    answer+=1
    return answer

코드 설명

 

  • 3중 반복문:
    • 첫 번째 for i in range(n - 2)는 첫 번째 숫자를 선택
    • 두 번째 for j in range(i + 1, n - 1)는 첫 번째 숫자 이후의 숫자들을 두 번째로 선택
    • 세 번째 for k in range(j + 1, n)는 두 번째 숫자 이후의 숫자들을 세 번째로 선택
    • 이렇게 해서 중복 없이 3개의 숫자를 선택
  • 합이 0인지 확인:
    • 각 조합에서 number[i] + number[j] + number[k] == 0인지를 확인
    • 합이 0이라면 answer를 1 증가
  • 결과 반환:
    • 마지막에 삼총사의 수 answer를 반환

for i in range(n-2)인 이유

  • 배열의 길이가 n = 5일 때 (배열 인덱스는 0부터 4까지 있음)
    세 개의 숫자(i, j, k)를 고르려 하는 상황
  • 첫 번째 숫자 i를 선택할 때
    • i가 0이면 j는 1, k는 2, 3, 4까지 선택 가능
    • i가 1이면 j는 2, k는 3, 4까지 선택 가능
    • i가 2이면 j는 3, k는 4만 선택 가능
    • i가 3이면 j는 4까지, k는 고를 수 없음

따라서 i는 n-3까지 반복해야 k가 정상적으로 마지막 인덱스까지 선택 가능

  • for i in range(n - 2): # 첫 번째 숫자 i는 n-3까지 반복

다른 정답 코드

import itertools

def solution(number):
    answer = 0
    
    # number 배열에서 3개씩 조합을 구하고 그 합이 0인지 체크
    for comb in itertools.combinations(number, 3):
        if sum(comb) == 0:
            answer += 1
    
    return answer

코드 설명

  1. itertools.combinations(number, 3):
    • itertools.combinations는 number 배열에서 3개씩의 조합을 반환 (이 조합은 튜플로 반환됨)
    • 예를 들어 number = [-2, 3, 0, 2, -5]일 경우, combinations 함수는 [(-2, 3, 0), (-2, 3, 2), (-2, 3, -5), ...]와 같은 3개의 숫자 조합을 반환
  2. 합이 0인지 확인:
    • 각 조합에 대해 sum(comb)가 0인지 체크
    • 0이라면 answer를 1 증가
  3. 결과 반환:
    • 마지막에 삼총사의 수 answer를 반환