정수 배열 numbers가 주어집니다.
numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서
만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers의 길이는 2 이상 100 이하입니다
- numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예
numbersresult
numbers | result |
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
입출력 예 설명
입출력 예
- 2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
- 3 = 2 + 1 입니다.
- 4 = 1 + 3 입니다.
- 5 = 1 + 4 = 2 + 3 입니다.
- 6 = 2 + 4 입니다.
- 7 = 3 + 4 입니다.
- 따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
문제 접근 방식
문제 요구사항
입력 : 정수 배열 numbers
출력 : 배열 내 서로 다른 두 인덱스의 수를 더한 모든 합을 중복 없이 오름차순으로 정렬한 정수 배열
조건 : 중복되는 합이 존재할 경우 한 번만 기록해야 하며, 오름차순 정렬을 통해 결과를 반환해야 합니다.
문제 해결을 위해 , 배열 내 가능한 두 수의 조합에 대해 합을 구해야 합니다.
이 과정에서 중복 제거는 필수적입니다.
따라서 중첩 for문을 사용하여 i번째 수와 j번째 수의 합을 구하고, j는 i다음 인덱스로 지정하여 중복 계산을 방지합니다.
또한, 중복된 합을 제거하기 위해 HashSet의 집합 자료구조를 활용합니다.
집합은 데이터의 중복 저장을 방지하기 때문에 합산 결과를 저장할 때 유용합니다.
결과 값은 오름차순 정렬을 요구하기 때문에, 집합에 저장된 값들을 정렬하여, 배열로 변환하여야 한다.
🔍 코드 분석
import java.util.*; import java.util.stream.*; class Solution { public int[] solution(int[] numbers) { Set<Integer> sumSet = new HashSet<>(); for (int i = 0; i < numbers.length; i++) { for (int j = i + 1; j < numbers.length; j++) { sumSet.add(numbers[i] + numbers[j]); } } // 스트림을 사용하여 정렬 후 int 배열로 변환 return sumSet.stream() .sorted() .mapToInt(Integer::intValue) .toArray(); } }
1️⃣ 집합(HashSet)을 활용한 중복 제거
Set<Integer> sumSet = new HashSet<>();
두 수의 합을 저장할 집합을 생성합니다.
집합 자료구조는 데이터의 중복을 자동으로 제거하기 때문에,
두 수의 합이 동일한 경우에도 하나의 값만 저장됩니다.
2️⃣ 중첩 반복문을 통한 모든 조합 탐색
for (int i = 0; i < numbers.length; i++) { for (int j = i + 1; j < numbers.length; j++) { sumSet.add(numbers[i] + numbers[j]); } }
이중 for문을 활용하여 배열의 가능한 모든 두 수의 조합을 탐색합니다.
내부 for문에서 j = i + 1부터 시작하여 (i + j)와 (j + i)가 중복 되는 것을 방지합니다.
3️⃣ stream을 이용하여 집합을 리스트로 변환
return sumSet.stream() .sorted() .mapToInt(Integer::intValue) .toArray();
sumSet.stream()
HashSet에 저장된 값을 스트림으로 변환합니다.sorted()
기본 정렬 기준(오름차순)에 따라 정렬합니다.mapToInt(Integer::intValue)
각 객체를 기본 자료형 int로 매핑합니다.toArray()
최종적으로 int 배열로 변환하여 반환합니다.
728x90