[ Python ] 삼총사

2026. 6. 19. 10:20·TIL/코테
[Programmers/Python] 삼총사 풀이 정리
문제 링크: Programmers - 삼총사
서로 다른 3개의 인덱스를 선택하고, 세 수의 합이 0이 되는 경우의 수를 세는 완전탐색 문제다.

문제 핵심

정수 리스트 number가 주어졌을 때, 서로 다른 학생 3명을 골라 세 정수의 합이 0이 되는 경우의 수를 구하는 문제다.

 핵심은 같은 조합을 중복해서 세지 않도록 인덱스를 선택하는 것이다. 세 인덱스가 항상 a < b < c가 되도록 반복 범위를 설정하면 같은 조합을 한 번만 확인할 수 있다.

처음 생각한 접근

리스트 안에서 순회하면서 숫자 3개를 선택해 더하는 방식으로 접근했다.
처음에는 “숫자 3개를 선택해서 더해야 하나?”, “인덱스 3개를 골라야 하나?”를 구분하는 것이 핵심이었다.

처음 생각한 흐름은 다음과 같았다.

1. 리스트 안에서 숫자 3개를 고른다.
2. 예를 들어 인덱스 기준으로 (0, 1, 2), (0, 1, 3), (0, 1, 4)처럼 조합을 만든다.
3. 세 값을 더한 결과가 0이면 answer += 1을 한다.
4. 마지막에 answer를 반환한다.

 이 접근 방향 자체는 맞았다. 다만 처음에는 0, 2, 1처럼 이미 고른 조합의 순서만 바뀐 경우도 함께 떠올렸기 때문에, 중복을 어떻게 제거할지가 추가로 필요했다.

정리하면, 이 문제는 숫자 자체를 무작위로 고르는 문제가 아니라 서로 다른 인덱스 3개를 중복 없이 고르는 문제다.

처음 코드에서 틀린 점

def solution(number):
    answer = 0
    while a != b != c:
        for a,b,c in range(len(number)):
            if number[a] + number[b] + number[c] == 0:
                answer += 1
    return answer

1. 선언되지 않은 변수를 먼저 사용했다

while a != b != c에서 a, b, c는 아직 선언되지 않았다. 조건식을 검사하는 시점에 변수가 존재하지 않으므로 UnboundLocalError가 발생했다.

2. while문이 필요하지 않았다

 이 문제는 특정 조건이 될 때까지 반복하는 문제가 아니라, 가능한 3개 조합을 모두 확인하는 문제다. 따라서 while문보다는 정해진 범위를 순회하는 for문이 적합하다.

3. range()에서 값 3개를 바로 꺼내려 했다

for a, b, c in range(len(number)):

 range(len(number))는 한 번에 정수 하나씩 반환한다. 따라서 정수 하나를 a, b, c 세 변수에 나눠 담을 수 없어 타입 에러가 발생했다.

 처음 접근에서 “인덱스 3개를 고른다”는 방향은 맞았지만, 실제 코드에서는 인덱스 3개를 각각 따로 선택하는 반복 구조가 필요했다.

개선 방향

 힌트를 통해 while문이 필요하지 않다는 점을 확인했고, 세 인덱스를 직접 선택하는 방식으로 접근을 바꿨다. 중복 조합을 피하기 위해 인덱스는 항상 다음 조건을 만족하도록 설정했다.

a < b < c

 첫 번째 인덱스를 고른 뒤, 두 번째 인덱스는 첫 번째보다 뒤에서 고르고, 세 번째 인덱스는 두 번째보다 뒤에서 고르면 된다. 이렇게 하면 0, 1, 2와 0, 2, 1처럼 같은 조합을 중복해서 세지 않는다.

최종 풀이

def solution(number):
    answer = 0

    for a in range(len(number)):
        for b in range(a + 1, len(number)):
            for c in range(b + 1, len(number)):
                if number[a] + number[b] + number[c] == 0:
                    answer += 1

    return answer

풀이 흐름

첫 번째 반복문에서 a를 선택하고, 두 번째 반복문에서는 a + 1부터 b를 선택한다. 세 번째 반복문에서는 b + 1부터 c를 선택한다.

a: 첫 번째 학생의 인덱스
b: a보다 뒤에 있는 두 번째 학생의 인덱스
c: b보다 뒤에 있는 세 번째 학생의 인덱스

이 구조를 사용하면 세 인덱스가 항상 a < b < c가 된다. 이후 number[a] + number[b] + number[c]가 0이면 삼총사를 만들 수 있으므로 answer를 1 증가시킨다.

유사 유형 문제

정수 리스트 numbers가 주어졌을 때, 서로 다른 인덱스의 숫자 3개를 골라 세 수의 곱이 짝수가 되는 조합의 개수를 구하는 문제를 추가로 풀었다.

이 문제도 핵심 구조는 동일하다. 서로 다른 3개의 인덱스를 중복 없이 고른 뒤, 조건식만 바꾸면 된다.

유사 문제 풀이

def solution(numbers):
    answer = 0

    for a in range(len(numbers)):
        for b in range(a + 1, len(numbers)):
            for c in range(b + 1, len(numbers)):
                if (numbers[a] * numbers[b] * numbers[c]) % 2 == 0:
                    answer += 1

    return answer

삼총사 문제와 같은 점

두 문제 모두 서로 다른 3개를 고르는 조합 문제다. 따라서 반복문 구조는 그대로 사용할 수 있다.

a < b < c 구조를 만들면, 3개를 고르는 조합을 중복 없이 탐색할 수 있다.

삼총사 문제와 다른 점

차이는 조건식뿐이다. 삼총사 문제에서는 세 수의 합이 0인지 확인했고, 유사 문제에서는 세 수의 곱이 짝수인지 확인했다.

삼총사 조건: number[a] + number[b] + number[c] == 0
유사 문제 조건: (numbers[a] * numbers[b] * numbers[c]) % 2 == 0

핵심 정리

이번 풀이의 핵심은 서로 다른 3개의 인덱스를 중복 없이 선택하는 것이다.

range()는 한 번에 정수 하나씩 반환하므로 for a, b, c in range(...)처럼 사용할 수 없다. 세 개의 인덱스가 필요하다면 반복문을 나누거나, 조합을 만드는 기능을 사용해야 한다.

이번 풀이에서는 직접 3중 반복문을 사용했고, 각 반복문의 시작 범위를 조정해 a < b < c 조건을 만족시켰다. 덕분에 같은 조합을 중복해서 세지 않고 조건을 만족하는 경우만 정확히 계산할 수 있었다.

사용한 핵심 문법 정리

len(list)
리스트의 길이를 구한다. 인덱스 반복 범위를 만들 때 사용했다.
range(start, end)
start부터 end - 1까지 반복한다. 끝값은 포함하지 않는다.
중첩 for문
여러 개의 인덱스를 순서대로 선택할 때 사용했다. 이번 문제에서는 3개의 인덱스를 고르기 위해 3중 반복문을 사용했다.
리스트 인덱싱
number[a], number[b], number[c]처럼 특정 위치의 값을 가져올 때 사용했다.
if 조건문
세 수의 합이 0인지, 또는 세 수의 곱이 짝수인지 확인하는 데 사용했다.
% 나머지 연산자
유사 문제에서 곱이 짝수인지 확인하기 위해 사용했다. 어떤 수를 2로 나눈 나머지가 0이면 짝수다.
answer += 1
조건을 만족하는 조합을 찾을 때마다 개수를 1씩 증가시킨다.
정리하면, 3개를 고르는 완전탐색 문제에서는 먼저 중복 없는 인덱스 구조를 만들고, 이후 문제에서 요구하는 조건식만 정확히 바꿔주면 된다.

'TIL > 코테' 카테고리의 다른 글

[ Python ] 시저 암호  (0) 2026.06.25
[ SQL ] 아픈 동물 찾기  (0) 2026.06.24
[ Python ] 최소직사각형  (0) 2026.06.24
[ Python ] 크기가 작은 부분문자열  (0) 2026.06.23
[ Python ] 이상한 문자 만들기  (0) 2026.06.18
'TIL/코테' 카테고리의 다른 글
  • [ SQL ] 아픈 동물 찾기
  • [ Python ] 최소직사각형
  • [ Python ] 크기가 작은 부분문자열
  • [ Python ] 이상한 문자 만들기
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
[ Python ] 삼총사
상단으로

티스토리툴바