프로그래머스 “두 개 뽑아서 더하기” 문제 해결과정입니다.
두 개 뽑아서 더하기
문제설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers의 길이는 2 이상 100 이하입니다.
- numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예
| numbers | result |
|---|---|
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
입출력 예 설명
입출력 예 #1
- 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 해야 합니다.
입출력 예 #2
- 2 = 0 + 2 입니다.
- 5 = 5 + 0 입니다.
- 7 = 0 + 7 = 5 + 2 입니다.
- 9 = 2 + 7 입니다.
- 12 = 5 + 7 입니다.
- 따라서
[2,5,7,9,12]를 return 해야 합니다.
문제 해결과정
프로그래머스 코드
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
Set<Integer> set = new TreeSet();
for(int i = 0; i < numbers.length; i++) {
for(int j = i+1; j < numbers.length; j++) set.add(numbers[i] + numbers[j]);
}
int[] result = new int[set.size()];
int num = 0;
for(int k : set) result[num++] = k;
return result;
}
}
- 문제가 원하는 건 numbers의 서로 다른 인덱스의 요소들을 더했을 때 중복되지 않는 수의 배열을 오름차순으로 출력하는 것이다.
- set을 사용한 이유는 중복되는 수가 없다는 것이며, TreeSet은 내부의 요소들을 알아서 오름차순으로 정렬해준다는 특징 때문이다.
- numbers의 요소들을 이중 for문으로 더하며 set에 삽입해준다.
- 출력할 int 타입 배열을 선언 후 set의 요소들을 삽입한다.
다섯 줄 코드
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
Set<Integer> set = new TreeSet();
for(int i = 0; i < numbers.length; i++) {
for(int j = i+1; j < numbers.length; j++) set.add(numbers[i] + numbers[j]);
}
return set.stream().mapToInt(Integer::intValue).toArray();
}
}
- set의 요소를 스트림으로 변환
- 스트림의 각 요소를 mapToInt, Integer::intValue를 통해 Integer 요소를 int 타입으로 변환
- toArray()를 통해 요소를 배열로 변환
정리
- TreeSet 선언
- 이중 for문으로 각 인덱스 더하며 set에 삽입
- set의 요소들을 result에 삽입