programmers.co.kr/learn/courses/30/lessons/68644
직접 푼 코드
import java.util.*;
class Solution {
/**
* 정수 배열 numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑은 다음,
* 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return한다.
*
* Logic
* 배열의 0번 인덱스부터 마지막 인덱스까지 반복하면서
* 같은 인덱스를 제외한 모든 인덱스를 한 번씩 더한다.(numbers[0] + number[1~n] = n)
* 더한 결과 값을 set에 저장하고
* 배열로 바꿔서 반환한다.
*
*/
public int[] solution(int[] numbers) {
int[] answer = {};
Set sumAscSortList = sumAscSort(numbers);
answer = setToArray(sumAscSortList);
return answer;
}
private int[] setToArray(Set set) {
List<Integer> resultList = new ArrayList<>(set);
Collections.sort(resultList);
int[] result = new int[resultList.size()];
for(int i = 0 ; i < resultList.size(); i++ ) {
result[i] = resultList.get(i);
}
return result;
}
private Set sum(int numbers[]) {
Set<Integer> resultSet = new HashSet<>();
for (int i = 0; i<numbers.length;i++) {
for(int j = i+1; j<numbers.length;j++) {
int sum = numbers[i] + numbers[j];
resultSet.add(sum);
}
}
return resultSet;
}
}
sum()
sum()는 배열의 서로 다른 인덱스에 있는 두 수를 합한 다음, 중복 값이 없게 HashSet에 저장해서 반환한다.
내부 로직까지 solution()에서 볼 필요 없을 것 같아서 따로 분리했다.
setToArray()
set에서 바로 배열로 변경하는 법을 알았다면 좀 더 깔끔하게 짤 수 있을 것 같았는데, 방법을 몰랐다.
다 풀고 다른 풀이를 참고하다가 스트림으로 비교적 깔끔하게 바로 기본형 int배열로 컨버팅 하는 방법을 알게 됐다.
고친 코드
import java.util.*;
class Sum {
public int[] solution(int[] numbers) {
int[] answer = {};
answer = sumAscSort(numbers);
return answer;
}
private int[] sumAscSort(int numbers[]) {
Set<Integer> resultSet = new HashSet<>();
for (int i = 0; i<numbers.length;i++) {
for(int j = i+1; j<numbers.length;j++) {
int sum = numbers[i] + numbers[j];
resultSet.add(sum);
}
}
return resultSet.stream()
.sorted()
.mapToInt(Integer::intValue)
.toArray();
}
}
보다시피 스트림을 이용해서 setToArray()에서 하는 기능을 한꺼번에 할 수 있었다. 덕분에 setToArray() 전체를 뺄 수 있었다.
'알고리즘' 카테고리의 다른 글
선택 정렬(Selection sort) (0) | 2020.12.29 |
---|---|
거품 정렬(Bubble Sort) (0) | 2020.12.29 |
프로그래머스 - 모의고사 (0) | 2020.11.26 |
선택정렬SelectionSort (0) | 2020.10.08 |
알고리즘 (0) | 2020.10.08 |