1 minute read



문제 풀이


int형 배열 numbers에서 3개의 원소를 뽑아 합이 0일 경우에만 카운트를 하면 되는 문제이다.
간단한 조합공식을 활용해서 3개의 수를 뽑을 수 있다.

조합을 활용해 접근할 수 있는 아이디어를 생각해보자.

  • 문제에서 3개의 수를 뽑는다고 정해놨기 때문에 단순하게 반복문을 3번 돌면 된다.
  • 뽑은 수를 또 뽑으면 안되니(중복되면 안됨) 앞에서부터 차례대로 뽑으면 된다.


그럼 코드를 작성해보자.

1
2
3
4
5
6
7
8
int answer = 0;
for(int i=0; i<number.length; i++) {
    for(int j=i+1; j<number.length; j++) {
        for(int k=j+1; k<number.length; k++) {
            if(number[i]+number[j]+number[k] == 0) answer++;
        }
    }
}

3중 반복문을 통해 첫번째, 두번째, 세번째 수를 자기자신이 아닌 다음 수를 고르면 된다.
> 그렇게 뽑은 3개의 수의 합이 0이 될 때 카운트를 1씩 증가시키면 된다.



작성 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
    public static void main(String[] args) {
        int[] number = {-2, 3, 0, 2, -5};
        // int[] number = {-3, -2, -1, 0, 1, 2, 3};
        // int[] number = {-1, 1, -1, 1};

        long start = System.currentTimeMillis();
        solution(number);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }

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

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

        System.out.println(answer);
        return answer;
    }
}

회고

  • 프로그래머스 코딩테스트 연습에 새로운 문제가 추가되어 못참고 바로 풀기 시작했다.
  • 백트래킹이나 재귀를 통한 조합 공식으로도 풀어봐야겠다.