두 개 뽑아서 더하기

이윤설·2024년 5월 17일
post-thumbnail

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


제출코드

import java.util.*;

class Solution {
    public List<Integer> solution(int[] numbers) {
        int sum; 
        List<Integer> sumList = new ArrayList<>();
        List<Integer> answerList = new ArrayList<>();

        
        for(int i=0; i<numbers.length; i++) {
            for(int j=i+1; j <numbers.length; j++) {
                sum = numbers[i] + numbers[j];
                
                if (sumList.contains(sum)) {
                    continue;    
                } else {
                    sumList.add(sum);
                    answerList.add(sum);
                }
            }   
        }
        Collections.sort(answerList);
        return answerList;
    }
}

배열의 모든 수들의 합계(중복 허용X)를 구하여 배열에 저장한 후 오름차순 정렬 후 리턴하는 쉬운 문제다.
어찌저찌 통과하기는 했지만 반환형도 리스트로 바꿔서 제출하기도 했고,
코드가 지저분해서 맘에 들지는 않는다.

Set을 활용했으면 더 간단하게 풀 수 있었을 것 같았는데 생각이 나지는 않았다.

모범답안

import java.util.*;

class Solution {
    public int[] solution(int[] numbers) {
        Set<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().mapToInt(Integer::intValue).sorted().toArray();
    }
}
  1. 이중 반복문으로 합을 구한 후, Set 객체에 결과를 넣어준다.
  2. 마지막으로 Set을 array로 변환하기 위해선 stream을 사용하면 편리하다.
set.stream().mapToInt(Integer::intValue).sorted().toArray();

a) set.stream() -> set을 stream()을 통해 스트림으로 변환
b) .mapToInt(Integer::intValue)
-> 스트림의 각 요소를 Integer 객체에서 기본형 int로 변환한다.
이때 Integer::intValue는 Integer 객체의 intValue 메서드를 참조하는 메서드 참조다.
c) .sorted() -> 정렬한다.
d) .toArray() -> array로 변경한다.


배운점

  1. Set을 array로 바꿀 때는 스트림을 사용하면 매우 간편하다 ^^
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글