알고리즘/프로그래머스

<두 개 뽑아서 더하기> 풀이

OneMoreThing 2024. 1. 25. 12:10

문제 설명

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

 

제한사항

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

입출력 예

numbers result
[2, 1, 3, 4, 1] [2, 3, 4, 5, 6, 7]
[5, 0, 2, 7] [2, 5, 7, 9, 12]

 

 

문제 풀이

문제의 입출력 예를 보면 중복된 결과값은 한 번만 저장하는 것을 알 수 있다. (예2 : 5+2=7, 0+7=7)

중복을 허용하지 않는 것에서 Java Collections Framework 의 Set을 이용하면 좋겠다는 생각을 하게되었다.

이를 토대로 아이디어를 단계별로 정리해보면 아래와 같다.

Step1 : 인자로 전달된 int[] numbers 의 원소들을 각각 더해서 Set에 대입한다.
Step2 : Set의 원소들을 새로운 배열에 대입한다.
Step3 : 새로운 배열을 오름차순으로 정렬한 후 리턴한다.

 

이를 코드로 구현하면 다음과 같다.

 

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = {};
        HashSet<Integer> answerSet = new HashSet<>();
        for(int i = 0; i<numbers.length-1; i++){
            for(int j = i+1; j<numbers.length; j++){ //두 수의 합 중복없이 저장
                answerSet.add(numbers[i] + numbers[j]);
            }
        }
        answer = new int[answerSet.size()];

        int index = 0;
        Iterator<Integer> iterator = answerSet.iterator();
        while(iterator.hasNext()){ //Set -> int[] 로 저장
            answer[index] = iterator.next();
            index++;
        }
        Arrays.sort(answer); // 오름차순 정렬
        return answer;
    }
}

 

주의사항

HashSet에 저장된 원소를 새로운 배열에 대입하는 과정에서 Iterator를 사용해야 한다! 이를 활용해서 while 반복문의 반복 조건 확인을 Iterator의 메소드인 hasNext()로 처리하였다.

 

오늘의 교훈

Java Collections Framework를 능숙하게 다루는 것도 실력이다. 복잡한 과정들을 일일히 구현하지 않아도 되서 문제풀이가 간결해지고 능률이 좋아진다. 컬렉션즈 프레임워크 연습을 많이하자

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

<명예의 전당 (1)> 풀이  (4) 2024.01.30
<콜라 문제> 풀이  (0) 2024.01.29
<푸드 파이트 대회> 풀이  (0) 2024.01.26
<K번째 수> 풀이  (0) 2024.01.25
<문자열 내 마음대로 정렬하기> 풀이  (2) 2024.01.24