알고리즘

배열에서 두 개 뽑아서 더하기

voider 2020. 10. 21. 01:36

programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한�

programmers.co.kr

직접 푼 코드

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