문제는 프로그래머스를 참고하였다
https://school.programmers.co.kr/learn/courses/30/lessons/68644
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
내가 생각한 슈도 코드는 다음과 같다
1. 먼저 input 배열에서의 모든 쌍의 조합을 찾아서 임시 배열에 저장을 한다
2. 그 다음 임시배열에서 중복되는 쌍을 제거하고, 오름차순으로 정렬을 한다
3. 정렬된 것을 배열로 return
내가 구현한 코드
import java.util.*;
class Solution {
public int[] solution(int[] numbers) {
ArrayList<Integer> result = new ArrayList<>();
for(int i=0; i < numbers.length ; i++){
for(int j = i+1; j < numbers.length ; j++){
result.add(numbers[i]+numbers[j]);
}
}
int[] answer = result.stream().distinct().sorted().mapToInt(Integer::intValue).toArray();
return answer;
}
}
이번 문제를 통해서 나는 stream의 int형 변환과 Array로 변환하는 과정을 경험해 볼 수 있었다.
먼저 다음과 같이 작성을 하고 통과하였다.
나는 여기서 stream에 대해서 좀 공부하고 넘어가야겠다고 생각을 하였다.
사실 자바8에 대해서 공부를 하였을 때, 스트림의 원리에 대해서 간단히 알아보고 문제를 풀어보는 연습을 해보았다.
그렇지만 단순히 Array를 받고서 Array를 처리하는 과정을 겪다보니, Array를 Stream으로 바꾸고 처리하고 int형 배열로 반환하는 과정에서 조금 낯선 부분이 생겨서 그 부분에 대해서 정리를 해보자한다.
위의 코드를 보면서 설명을 해보겠다.
1. 먼저 스트림을 생성해야 할 것이다.
나는 먼저 ArrayList을 가지고 Stream을 생성할 것이다.
그러기 위해서
ArrayList<Integer> result = new ArrayList<>(); //비어있는 리스트지만 예시를 들기 위해 사용
result.stream();
을 사용하였다. 위의 결과는
Stream<Integer> intStream = result.stream();
다음과 같은 형을 반환한다.
위에서는 List를 가지고 스트림을 생성하였지만, 배열을 가지고 Stream을 생성하는 경우도 있으니 그 방법에 대해서 적어보도록 하겠다.
int[] result = {1,2};
Stream<Integer> intStream = Arrays.stream(result);
으로 적어내면 될 줄 알았다. 하지만 오류가 발생하게 되고 작동하지 않을 것이다.
이 과정에서 stream의 생성 방식에 대해서 조금 더 설명해보도록 하겠다.
Arrays.stream() 메서드는 두 가지 오버로드가 존재한다.
첫 번째로는 Primitive 배열 (int[], double[], long[])
이 경우에는 IntStream, DoubleStream, 또는 LongStream 같은 primitive 스트림을 반환한다.

정확히 아까 그 코드는 아래와 같이 IntStream형을 반환했던 것이었다.
int[] result = {1,2};
IntStream intStream = Arrays.stream(result);
그래서 위의 코드를 사용하기 위해서는
IntStream의 타입을 Stream<Integer>의 타입으로 바꿔주는 과정이 필요하다.
int[] result = {1, 2, 3, 4, 5};
Stream<Integer> intStream = Arrays.stream(result).boxed();
간단하게 boxed() 메서드를 붙여주면된다. 이렇게 하면 Stream<Integer>형식을 사용할 수 있다.
두 번째로는 객체 배열 (Integer[] 등)
이 경우에는 Stream<T> (객체 스트림)을 반환한다.

문제를 풀 때는 이 방식(ArrayList(객체 배열)로 스트림 생성을 하였으므로 boxed()를 사용하지 않았던 것이다)
그 다음 distinct() 메서드는 스트림 내부의 중복 데이터를 제거해 주는 중간 연산자이다.
sorted() 메서드는 스트림 내부의 데이터를 오름차순으로 정렬해주는 중간 연산자이다.
mapToInt 메서드에 대해서 설명해보겠다.

반환형은 IntStream으로 나오고
매개변수는 ToIntFunction<T> 타입의 함수형 인터페이스를 받아서 사용한다.
이 함수는 입력 값을 받아 int를 반환하는 함수이다.
나는 이 mapToInt함수를
객체 스트림 -> primitive 스트림으로 변환하여, IntStream의 메서드(sum, average, min, max,toArray 등)중에서 toArray메서드를 활용하기 위해서 사용하였다.
결론적으로 보면
ArrayList -> Stream<Integer> -> distict() 중간연산자 -> sorted() 중간 연산자 -> IntStream -> int형 배열로 바뀌는 것이다.

이제 책에서 풀어준 풀이를 한번 참고해서 보겠다.
import java.util.HashSet;
class Solution {
public int[] solution(int[] numbers) {
HashSet<Integer> set = new HashSet<>();
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().sorted().mapToInt(Integer::intValue).toArray();
}
}
여기서는 중복을 제거하기 위해서 set을 사용한 모습을 볼 수 있다.
'코팅테스트' 카테고리의 다른 글
| [코딩 테스트] 근손실 (feat. 백트래킹) (1) | 2025.01.25 |
|---|---|
| [코딩 테스트] 체스판 다시 칠하기 (4) | 2025.01.24 |
| [코딩 테스트] 방문 길이 (3) | 2025.01.08 |
| [코딩 테스트] 실패율 (2) | 2025.01.08 |
| [코딩 테스트] 모의고사 (Feat. Math함수와 Stream의 max() 사용에 관하여) (4) | 2025.01.07 |