https://school.programmers.co.kr/learn/courses/30/lessons/68644

정수 배열 numbers가 주어지면 서로 다른 인덱스에 있는 2개의 수를 뽑아 더해 만들 수 있는 모든 수를 오름차순으로 정렬하여 출력하는 문제이다.
numbers의 최대 데이터 개수는 100이므로 시간 복잡도는 고려하지 않아도 된다.
배열에서 두 수를 빠짐없이 선택하는 방법은 다음과 같다.
e.g. [5, 0, 2, 7] 이라는 배열이 있다고 가정할때,
이와 같이 각 수에서 자신보다 뒤에 있는 수를 선택하면 된다.
그리고 중복을 허용하지 않기로 하였으므로 중복값 제거를 위해 HashSet을 자료구조로 사용한다.
HashSet은 HashMap에서 Map의 특징인 중복 key는 존재할 수 없다는 점을 이용하여 만든 자료구조로 우리가 수학에서 생각하는 개념인 Set과 동일한 역할을 한다고 보면 된다.
마지막으로 자바에는 스트림(stream)이라는 기능이 있다. 자바 8부터 추가된 기능으로, 컬렉션이나 배열과 같은 데이터 소스에서 요소를 처리하고 다양한 연산을 수행할 수 있는 API이다.
stream() 함수를 통해 컬렉션을 스트림으로 만든 후 sorted() 함수를 통해 오름차순으로 정렬한다.
그리고 mapToInt(Integer::intValue)를 통해 int 자료형으로 뽑아내어 toArray()를 통해 이를 int[] 배열로 변환하여 반환하는 것이다.
스트림에 대한 자세한 내용은 아래 링크에 작성해 두었으니 참고하길 바란다.
https://velog.io/@wonotter/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%97%90-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9E%90%EB%B0%94-%EB%AC%B8%EB%B2%95
따라서 문제풀이 코드는 아래와 같다.
import java.util.HashSet;
class Solution {
public int[] solution(int[] numbers) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length - 1; i++) {
for (int j = i + 1; j < numbers.length; j++) {
set.add(numbers[i] + numbers[j]);
}
}
return set.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}