
문제
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
코드 설명
- 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개의 숫자 조합을 반환
- 합이 0인지 확인:
- 각 조합에 대해 sum(comb)가 0인지 체크
- 0이라면 answer를 1 증가
- 결과 반환:
- 마지막에 삼총사의 수 answer를 반환
'코딩 테스트 연습 > [프로그래머스] Python' 카테고리의 다른 글
| [LV.3] 완전탐색 > 최소직사각형 (0) | 2025.07.03 |
|---|---|
| [LV.3] 연습문제 > 크기가 작은 부분문자열 (1) | 2025.07.02 |
| [LV.3] 연습문제 > 이상한 문자 만들기 ⭐ (0) | 2025.06.30 |
| [LV.2] 월간 코드 챌린지 시즌1 > 3진법 뒤집기 (0) | 2025.06.27 |
| [LV.2] 연습문제 > 최대공약수와 최소공배수 (0) | 2025.06.26 |