프로그래머스 두 개 뽑아서 더하기

최준호·2021년 7월 19일
0

algorithm

목록 보기
19/39

문제

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

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
    - numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예

풀이

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class TwoPickSum {
    public static void main(String[] args) {
        int[] numbers = {5,0,2,7};
        TwoPickSum tps = new TwoPickSum();

        int[] solution = tps.solution(numbers);
        for (int i : solution) {
            System.out.println("i = " + i);
        }
    }

    public int[] solution(int[] numbers) {
        //모두 더한 값을 Set에 담아줌
        Set<Integer> set = new HashSet<>();
        //numbers 를 for 문으로 선형탐색
        int leng = numbers.length;
        for(int i=0; i<leng-1; i++){
            for(int j=i+1; j<leng; j++){
                int su1 = numbers[i];
                int su2 = numbers[j];
                set.add(su1 + su2);
            }
        }

        int[] answer = new int[set.size()];
        int i=0;
        for(int s : set){
            answer[i++] = s;
        }

        Arrays.sort(answer);
        return answer;
    }
}

선형 검색으로 하나씩 모두 더해가고 중복된다면 담지 않아야 하기 때문에 Set을 사용하여 데이터를 담았다. 그리고 마지막으로 sort를 해주면 문제는 끝나는데. 여기서 Set의 경우 HashSet이 아닌 TreeSet을 사용해서 담게되면 마지막의 sort를 하지 않아도 된다. 왜냐하면 TreeSet은 담을때 정렬을 해서 담기 때문인데. 나는 왜 HashSet을 사용하여 sort를 했냐? TreeSet은 정렬을 해서 담기 때문에 담을때마다 다시 sort를 해야한다. 그래서 속도가 느려진다. 코드상에서는 간결해지고 sort를 따로 할 필요가 없어져서 좋긴 하지만 시간이 덜 걸리는 HashSet으로 빠르게 담고 담겨져 있는 데이터를 정렬하는게 빠르다 생각해서 다음과 같이 풀었다.

정렬해서 담는건 TreeSet이지만 너무 느려서 HashSet으로 빠르게 담고 정렬하는 것도 좋음!

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글