Algorithm/Java

프로그래머스 - 두 개 뽑아서 더하기 java :: 월간 코드 챌린지 시즌1 :: 68644

고고마코드 2022. 7. 4. 19:00
반응형

문제 링크

코딩테스트 연습 - 두 개 뽑아서 더하기 | 프로그래머스 (programmers.co.kr)


문제 이해하기

배열 numbers에 있는 수의 1vs1 덧셈조합을 찾는 문제입니다.

단, 중복이 없어야 하고 오름차순 정렬이 되어야 한다는 게 포인트네요.

중복이 없어야 하니 Set을 사용하면 쉽게 풀 수 있을 거라 생각했고

그 중에서도 TreeSet을 이용하면 정렬까지 되니까 자바로는 아주 쉬운 문제였네요.


문제 풀이

코드 1

public int[] solution(int[] numbers) {
    Set<Integer> set = new TreeSet<Integer>();

    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();
}

오랜만에 오류 없이 한 번에 푼 문제였어요.
근데 처리속도가 너무 마음에 안 들더라구요...

테스트 케이스 처리속도

  • 🔥 평균 3.5ms / 최대 4.69ms

코드 2

public int[] solution(int[] numbers) {
    Set<Integer> set = new TreeSet<Integer>();

    for(int i=0; i<numbers.length; i++) {
        for(int j=i+1; j<numbers.length; j++) {
            set.add(numbers[i] + numbers[j]);
        }
    }

    int[] answer = new int[set.size()];
    Iterator<Integer> iter = set.iterator();
    int i = 0;
    while(iter.hasNext()) {
        answer[i++] = iter.next();
    }

    return answer;
}

풀이1에서 반환하는 부분만 stream을 제거하고 iterator를 사용했어요.

풀이1에 비해서 처리속도는 2배 이상 빨라졌어요.

테스트 케이스 처리속도

  • 🔥 평균 0.68ms / 최대 2.37ms

반응형