
푸는데 어려움을 겪었던 문제. 일단 어떻게 접근을 하면 좋을지 생각해 보았다.
주어진 number배열에서 숫자 세 쌍으로 이루어진 배열을 각각 만들어내야했는데 여기서 어떤 방법을 써야할 지 도무지 생각이 떠오르지 않았다. 힌트를 얻기 위해 검색을 해보니 '브루트포스'라는 방식으로 쉽게 해결할 수 있다는 글을 보았다.
브루트포스가 뭔가하니 모든 가능한 경우의 수를 하나씩 탐색해서 문제의 해답을 찾는 방법을 의미했다. 직관적이고 적용하기가 상대적으로 쉽지만 문제의 크기가 커질 경우 탐색에 소요되는 시간이 기하 급수적으로 늘어날 수 있다는 단점이 있었다.
브루트포스 방식으로 이 문제를 접근하면
1. 모든 학생 번호의 조합을 고려한다.
2. 첫 번째 학생부터 마지막 학생까지 순차적으로 접근하면서, 나머지 학생들과의 조합을 확인한다.
3. 이 때, 세 학생의 번호 합이 0이 되는지 확인한다.
그럼 돌아가서 문제 전체에 대한 접근은
1. 첫 번째 학생의 번호를 고른다.
2. 첫 번째 학생 다음에 오는 학생의 번호를 선택한다.
3. 두 번째 학생 다음에 오는 학생의 번호를 선택한다.
4. 이렇게 선택된 세 학생의 번호를 합한다.
5. 그 합이 0이라면 카운트를 증가시킨다.
class Solution {
public int solution(int[] number) {
int answer = 0; // 삼총사 조합의 수를 저장할 변수 초기화
int len = number.length; // 학생들의 총 수
// 첫 번째 학생을 선택.
// 세 학생을 선택해야하므로, n - 2까지만 반복.
for (int i = 0; i < len - 2; i++) {
// 첫 번째 학생 다음에 오는 학생을 선택.
// 마찬가지로 세 번째 학생도 선택해야하므로 n - 1까지만 반복.
for (int j = i + 1; j < len - 1; j++) {
// 두 번째 학생 다음에 오는 학생을 선택.
// 세 학생 모두 선택했으므로 n까지 반복.
for (int k = j + 1; k < len; k++) {
// 선택된 세 학생의 번호 합을 계산.
if (number[i] + number[j] + number[k] == 0) {
answer++; // 합이 0이라면 삼총사 조합의 수를 증가.
}
}
}
}
return answer; // 삼총사 조합의 총 수를 반환.
}
}
이렇게 풀 수 있다.