
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
number의 길이 ≤ 13number의 각 원소 ≤ 1,000| number | result |
|---|---|
| [-2, 3, 0, 2, -5] | 2 |
| [-3, -2, -1, 0, 1, 2, 3] | 5 |
| [-1, 1, -1, 1] | 0 |
입출력 예 #2
입출력 예 #3
#include <string>
#include <vector>
#include<iostream>
using namespace std;
int solution(vector<int> number) {//vector 클래스를 사용해 배열 생성
int answer = 0;//합이 0인 조합의 수를 저장할 변수
for( int i =0; i< number.size()-2;i++)// 첫번째 학생을 뽑는 반복문
for( int j =i+1;j<number.size()-1;j++)//두번째 학생을 뽑는 반복문
for( int k = j+1; k<number.size();k++)//세번째 학생을 뽑는 반복문
{
if(number[i]+number[j]+number[k] == 0)//배열에서 골라낸 세 원소의 합이 0이면
answer++;//조합의 수를 늘린다.
}
if(answer == 0)// 세 원소의 합이 0인 조합이 없다면
cout <<"삼총사가 될 수 있는 방법이 없습니다."<<endl;
return answer;
}
이 문제는 주어진 배열에서 세 개를 골라 합이 0인 조합의 수를 찾아내는 문제이다. 배열에서 항목을 고른다 라는 점에서 반복문을 사용했다. 문제에서 3개의 원소를 골라 그 합이 0인 조합을 찾으라했으니 삼중 반복문을 사용해 뽑아낸 인덱스들끼리 더해서 합을 확인하면 문제를 쉽게 해결할 수 있다.
int solution(vector<int> number) : vector 클래스를 사용해 number 배열을 만든다.int answer = 0; : 합이 0이 되는 조합의 수를 저장할 변수 생성for( int i =0; i< number.size()-2;i++) : 첫번째 학생을 고르는 i 인덱스를 사용한 반복문 ⚠️ 총 3명의 학생을 뽑는 삼중 반복문을 사용하기 때문에 안쪽 반복문에서 중복되는 학생이 없도록 반복문의 범위를 앞으로 뽑게 될 두 명의 학생이 빠진 number.size()-2 로 설정한다.for( int j =i+1;j<number.size()-1;j++) : 두번째 학생을 고르는 j 인덱스를 사용한 반복문 ⚠️ 바깥 반복문 i 인덱스를 사용한 바깥 반복문에서 첫번째 학생을 골랐으니까 i에 1이 더해진 위치에서 시작하고 반복문의 범위도 앞으로 뽑을 한명의 학생이 빠진 number.size()-1 로 설정한다.for( int k = j+1; k<number.size();k++): 세번째 학생을 고르는 k 인덱스를 사용한 반복문 앞에서 두명의 학생을 이미 뽑았으니까 j에서 1이 더해진 위치에서 시작한다.if(number[i]+number[j]+number[k] == 0) : 뽑은 세 개의 합이 0이면 answer 증가오늘 문제는 수월하게 해결했다. 처음에 삼중 반복문에서 배열의 크기를 안쪽 반복문으로 들어갈수록 작도록 k 반복문의 범위를 number.size()-2 로 설정해서 오류가 있었다. 그러나 잘 생각해보면 i인덱스의 바깥 반복문의 크기가 가장 크게 되면 같은 학생이 여러번 선택될 가능성이 있어서 결과가 정확하게 나오지 않을 수 있다. 따라서 i < j < k 조건을 만족하는 인덱스 조합을 생성하기 위해서는 배열의 크기가 바깥 반복문으로 갈수록 작아야한다.