<프로그래머스>삼총사

박서윤·2023년 10월 23일

알고리즘 연습

목록 보기
3/4

푸는데 어려움을 겪었던 문제. 일단 어떻게 접근을 하면 좋을지 생각해 보았다.
주어진 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; // 삼총사 조합의 총 수를 반환.
        }
    }

이렇게 풀 수 있다.

0개의 댓글