필기시험 B part 2 & 3 | Code Kata: 삼총사
2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B, Part2 & 3 풀이 & 해석
- Part 2 : Part2. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
- Part 3: Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
Code Kata: 삼총사
042. 삼총사 | Solved Date: 2026-05-14-Tue | Problem Link
문제 설명
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
제한사항
- 3 ≤ number의 길이 ≤ 13
- 1,000 ≤ number의 각 원소 ≤ 1,000
- 서로 다른 학생의 정수 번호가 같을 수 있습니다.
입출력 예
| [-2, 3, 0, 2, -5] | 2 |
| [-3, -2, -1, 0, 1, 2, 3] | 5 |
| [-1, 1, -1, 1] | 0 |
number result
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.
입출력 예 #3
- 삼총사가 될 수 있는 방법이 없습니다.
기본 코드
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> number) {
int answer = 0;
return answer;
}
힌트
- 3중 for 문
- i < j < k
- number.size()
문제 풀이 과정
문제 나누기
- 3중 for 문: (i, j, k) 세 인덱스를 사용하여 서로 다른 세 학생을 선택합니다. 이때 (i < j < k) 순서로 탐색하여 중복 조합을 피합니다.
- 합 계산: 선택한 세 학생의 번호 합 number[i] + number[j] + number[k]가 0인지 확인합니다.
- 카운트: 합이 0일 때마다 answer를 1씩 증가시킵니다.
- 복잡도: (N)이 최대 13이므로 (O(N^3))의 시간 복잡도로도 충분히 제한 시간 내에 해결할 수 있습니다
문제 해석
- 왜 3중 반복문(For loop)을 사용하나요?
배열에서 서로 다른 3명의 학생을 뽑아야 하기 때문입니다.
- 첫 번째 학생의 위치를 가리키는 포인터 i
- 두 번째 학생의 위치를 가리키는 포인터 j
- 세 번째 학생의 위치를 가리키는 포인터 k
이 세 개의 포인터를 겹치지 않게 나란히 배치하여 배열 전체를 훑는 방식입니다.
- 인덱스 범위의 비밀 (n - 2, n - 1)
코드의 for문 조건을 보면 반복 범위가 각각 다르게 설정되어 있습니다.
for (int i = 0; i < n - 2; ++i) { // i는 뒤에 최소 2칸이 남아야 함
for (int j = i + 1; j < n - 1; ++j) { // j는 i 다음부터, 뒤에 최소 1칸이 남아야 함
for (int k = j + 1; k < n; ++k) { // k는 j 다음부터, 배열 끝까지
만약 배열의 길이가 5라면 (n = 5), 마지막으로 뽑을 수 있는 최후의 조합은 인덱스 [2, 3, 4]입니다.
- i가 배열의 끝까지 가버리면 j와 k가 뽑을 공간이 없어집니다.
- 따라서 i는 끝에서 3번째 자리(n-3)까지만 가도록 i < n - 2로 제한합니다.
- 같은 원리로 j는 끝에서 2번째 자리(n-2)까지만 가도록 j < n - 1로 제한합니다.
이 구조 덕분에 중복 없이 항상 i < j < k 순서가 보장되어, 같은 학생 조합을 중복해서 세지 않습니다.
- 예시 동작 시뮬레이션 ([-2, 3, 0, 2, -5])
이 배열에서 3중 loop가 어떻게 돌아가는지 앞부분만 추적해 보겠습니다.
- Step 1: i = 0 (값: -2) 일 때
- j = 1 (값: 3) 이 선택됨
- k = 2 (값: 0) (\rightarrow ) 2 + 3 + 0 = 1 (X)
- k = 3 (값: 2) (\rightarrow ) 2 + 3 + 2 = 3 (X)
- k = 4 (값: -5) (\rightarrow ) 2 + 3 + (-5) = -4 (X)
- j = 2 (값: 0) 으로 넘어감
- k = 3 (값: 2) (\rightarrow ) 2 + 0 + 2 = 0 (\rightarrow ) 삼총사 발견! (answer++)
- k = 4 (값: -5) (\rightarrow ) 2 + 0 + (-5) = -7 (X)
- j = 3 (값: 2) 으로 넘어감
- k = 4 (값: -5) (\rightarrow ) 2 + 2 + (-5) = -5 (X)
- j = 1 (값: 3) 이 선택됨
- Step 2: i = 1 (값: 3) 일 때
- 위와 같은 방식으로 j는 2부터, k는 3부터 시작하여 모든 조합을 찾습니다.
- 이 과정 중 i = 1 (3), j = 3 (2), k = 4 (-5) 일 때 3 + 2 + (-5) = 0이 되어 두 번째 삼총사를 찾게 됩니다.
- 성능 분석 (효율성)
- 시간 복잡도: (O(N^3))
- 학생 수 (N)명 중 3명을 순서 없이 고르는 조합의 가짓수는 N x (N-1) x (N-2) / 3x2x1 입니다.
- 문제 제한 사항에서 (N)의 최댓값이 13으로 매우 작습니다.
- 13명 중 3명을 고르는 경우의 수는 최대 286가지 밖에 되지 않습니다.
- 컴퓨터는 1초에 약 1억 번의 연산을 하므로, 286번의 연산은 0.00001초도 걸리지 않고 통과합니다.
이처럼 데이터가 적을 때는 코드가 직관적이고 버그 발생 확률이 낮은 **3중 반복문(완전 탐색)**이 가장 좋은 해결책입니다.
정답 소스 코드
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> number) {
int answer = 0;
int n = number.size();
for (int i = 0; i < n - 2; i++)
{
for (int j = i + 1; j < n - 1; j++)
{
for (int k = j + 1; k < n; k++)
{
if (number[i] + number[j] + number[k] == 0)
{
answer++;
}
}
}
}
return answer;
}
Comments:
- 문제를 풀면서 3중 포문을 써야하는 것 까지는 감이 왔는데 30분간을 고민하다 안풀려서 결국 답을 봤다.
- 쉬운거 같으면서 아직도 정확하게 인지가 안된거 같다 추후 다시 풀어보자.
- ? 그런데 이런 3중 포문을 실제 코딩 테스트에서 쓰이나 혹은 3중 포문은 나만 헷갈리는 건가...
추천글
게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원] | 종합
게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원] | 종합
About this Certification 홈페이지: https://www.kgq.or.kr/service/main.do검정안내: https://www.kgq.or.kr/service/info/cert.do국가기술자격증 (유효기간 없음)Since 2003시험일정 : https://www.kgq.or.kr/service/rcpt/sc_list.do원서접
devcol.tistory.com
- Part 1 : 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | Part1. 게임 프로그래밍 방법론: 1~25 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
- Part 2 : Part2. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
- Part 3: Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
