문제 핵심
number가 주어졌을 때, 서로 다른 학생 3명을 골라 세 정수의 합이 0이 되는 경우의 수를 구하는 문제다. 핵심은 같은 조합을 중복해서 세지 않도록 인덱스를 선택하는 것이다. 세 인덱스가 항상 a < b < c가 되도록 반복 범위를 설정하면 같은 조합을 한 번만 확인할 수 있다.
처음 생각한 접근
처음에는 “숫자 3개를 선택해서 더해야 하나?”, “인덱스 3개를 골라야 하나?”를 구분하는 것이 핵심이었다.
처음 생각한 흐름은 다음과 같았다.
2. 예를 들어 인덱스 기준으로 (
0, 1, 2), (0, 1, 3), (0, 1, 4)처럼 조합을 만든다.3. 세 값을 더한 결과가
0이면 answer += 1을 한다.4. 마지막에
answer를 반환한다. 이 접근 방향 자체는 맞았다. 다만 처음에는 0, 2, 1처럼 이미 고른 조합의 순서만 바뀐 경우도 함께 떠올렸기 때문에, 중복을 어떻게 제거할지가 추가로 필요했다.
처음 코드에서 틀린 점
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 세 변수에 나눠 담을 수 없어 타입 에러가 발생했다.
개선 방향
힌트를 통해 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핵심 정리
range()는 한 번에 정수 하나씩 반환하므로 for a, b, c in range(...)처럼 사용할 수 없다. 세 개의 인덱스가 필요하다면 반복문을 나누거나, 조합을 만드는 기능을 사용해야 한다.
이번 풀이에서는 직접 3중 반복문을 사용했고, 각 반복문의 시작 범위를 조정해 a < b < c 조건을 만족시켰다. 덕분에 같은 조합을 중복해서 세지 않고 조건을 만족하는 경우만 정확히 계산할 수 있었다.
사용한 핵심 문법 정리
len(list)range(start, end)start부터 end - 1까지 반복한다. 끝값은 포함하지 않는다.for문number[a], number[b], number[c]처럼 특정 위치의 값을 가져올 때 사용했다.if 조건문0인지, 또는 세 수의 곱이 짝수인지 확인하는 데 사용했다.% 나머지 연산자answer += 1'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 |
