프로그래머스

[프로그래머스] 삼총사 - Java(자바)

nan2 2023. 2. 6. 20:19
반응형
문제설명
  • 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다.
  • 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다.
  • 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

 

제한사항
  • 3 ≤ number의 길이 ≤ 13<//li>
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

 

 

입출력 예

d 배열 result
[-2, 3, 0, 2, 5] 2
[-3, -2, -1, 0, 1, 2, 3] 5
[-1, 1, -1, 1] 0

 


[ 내가 푼 방법 ]

import java.util.Arrays;

class Solution {
    static int answer = 0;
    
    public int solution(int[] number) {
        combination(number, 3, 0, 0, new int[3]);
        return answer;
    }
    
    public static void combination(int[] number, int limit, int startIdx, int cnt, int[] selectArr) {
        // 종료조건
        if (cnt == limit) {
            answer += Arrays.stream(selectArr).sum() == 0? 1 : 0;
            return;
        }
        
        for (int i=startIdx; i<number.length; i++) {
            selectArr[cnt] = number[i];
            combination(number, limit, i+1, cnt+1, selectArr);
        }
    }
}

 

재귀함수를 이용한 조합 코드로 구현

- 종료 조건

- for문 안에서 가지치기 방식으로 재귀함수 호출

 

 

조합 설명은 아래에!

 

[Java] 조합 알고리즘 java 코드로 구현하기

조합이란? 배열에서 몇개를 중복없이 추출하는 것을 말한다. 예를 들면, 배열 int[] arr = {1, 2, 3, 4} 에서 2개의 요소만 중복없이 추출하고 싶은 경우 [1, 2], [2, 3], [3, 4] [1, 3], [2, 4] [1, 4] 총 6개가 출력

dev-stack.tistory.com

 

 

[ 다른 풀이방법 ]

class Solution {
    public int solution(int[] number) {
        int answer = 0;

        for(int i=0; i<number.length-2; i++){
            for(int j=i+1; j<number.length-1; j++){
                for(int k=j+1; k<number.length; k++){
                    if(number[i]+number[j]+number[k]==0) answer++;
                }
            }
        }

        return answer;
    }
}

 

중첩 for문을 사용하여 조합보다 더 간단하게 구현하였다.

for문의 인덱스 i, j, k의 초기값을 바깥 for문의 idx + 1을 해주어서 이전 idx를 선택하지 않도록 함!

 

반응형