1 minute read


Input-1
[2,1,3,4,1]
Output-1
[2,3,4,5,6,7]

Input-2
[5,0,2,7]
Output-2
[2,5,7,9,12]

문제 풀이

이 문제를 풀때 주의할 점은 아래와 같다.

  • 배열의 인덱스별로 더할 때 본인 인덱스와는 더할 필요가 없다.
  • 배열의 인덱스별로 더하여 배열에 담을 때 중복값이 없어야 한다.
  • 담은 배열을 오름차순으로 정렬해야 한다.

중첩 반복문으로 인덱스 별로 더한 값을 알 수 있는데,
본인 인덱스일 경우에는 더할 필요가 없기 때문에 다른 인덱스일 경우에만 더하면 된다.

그리고 더한 값을 배열에 담을 때 중복값이 들어가면 안되기에 HashSet으로 담아 중복을 걸려냈다.

HashSet이란?
Set 인터페이스에서 지원하는 구현 클래스로 Set의 성질을 그대로 상속받기에 중복을 허용하지 않는다. 다만, 저장 순서를 고려하지 않는다.
저장 순서를 고려해야 한다면 같은 Set 인터페이스를 구현한 TreeSetLinkedHashSet를 사용할 수 있다.

문제 요구사항에 오름차순으로 정렬해야 하는데 왜 저장순서를 고려하지 않는 HashSet을 사용했나?

배열의 오름차순 정렬을 사용해보기 위해 정렬을 고려하지 않는 HashSet을 사용하였다.
그렇게 배열의 인덱스별로 더하여 HashSet에 담아 중복을 걸러내도록 작성하였다.

1
2
3
4
5
6
HashSet<Integer> set = new HashSet<>();
for (int i=0; i<numbers.length; i++) {
    for(int j=0; j<numbers.length; j++) {
        if (i != j) set.add(numbers[i] + numbers[j]);
    }
}

다만 앞서 말했듯, 정렬을 고려하지 않았기에 배열의 순서가 뒤죽박죽 일 것이라 오름차순 정렬을 해야 한다.
Set을 다시 정수배열로 담고 java.util.Arrays 클래스의 sort() 메서드를 사용하여 정렬하였다.

1
2
3
4
5
6
ArrayList<Integer> list = new ArrayList<>(set);
int[] answer = new int[list.size()];
for(int k=0; k<list.size(); k++) {
    answer[k] = list.get(k);
}
Arrays.sort(answer);


작성코드

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
import java.util.*;

class Solution {
    public static void main(String[] args) {
        int[] arr = {2, 1, 3, 4, 1};
        // int[] arr = {5, 0, 2, 7};
        solution(arr);
    }
    public static int[] solution(int[] numbers) {
        HashSet<Integer> set = new HashSet<>();
        for (int i=0; i<numbers.length; i++) {
            for(int j=0; j<numbers.length; j++) {
                if (i != j) set.add(numbers[i] + numbers[j]);
            }
        }
        ArrayList<Integer> list = new ArrayList<>(set);
        int[] answer = new int[list.size()];
        for(int k=0; k<list.size(); k++) {
            answer[k] = list.get(k);
        }
        Arrays.sort(answer);
        for (int ans : answer) System.out.println(ans);
        return answer;
    }
}

회고

  • Set 인터페이스에서 구현한 HastSet의 역할이 무엇인지 어떠한 상황에서 사용하는 것이 바람직한지 조금은 알게되었다.
  • 알고리즘 문제를 푸는 과정에서 배열을 어떻게 정렬하냐에 따라서 풀이속도가 달라지는 것을 느꼈다.