본문 바로가기

코딩 테스트

[프로그래머스] (Lv.1) 두 개 뽑아서 더하기

728x90

문제


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

 

 

-  출력 예시  -

정답 코드


<  내 정답 코드  >

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

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

        int[] result = new int[treeSet.size()];
        Iterator<Integer> it = treeSet.iterator();

        int idx = 0;
        while (it.hasNext()) {
            result[idx++] = it.next();
        }

        return result;
    }
}

 

<  타인 답변 코드  >

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer;
        List<Integer> list = new ArrayList<Integer>();

        for(int i = 0 ; i < numbers.length; i++){
            for(int j = i+1 ; j < numbers.length; j++){
                int tmp = numbers[i] + numbers[j];
                if(!list.contains(tmp)){
                    list.add(tmp);
                }
            }   
        }

        int size = 0;
        answer = new int[list.size()];
        for(int num : list){
            answer[size++] = num;
        }
        Arrays.sort(answer);
        return answer;
    }
}

이것을 주의하자!


-  일단 모든 수를 한 번씩 곱해야 한다. 한 번씩만 곱하면 되기 때문에 중첩 for 문을 사용했다. 그리고 더한 값이 중복하지 않도록 Set 인터페이스를 사용했으며, 오름차순으로 정렬되기 때문에 정렬 기능이 있는 TreeSet 클래스를 이용했다.

 

-  특별히 어렵지 않았지만, Integer 을 저장하는 Set 컬렉션에서 원시형 배열로 값을 저장하는 방법에 대해 주의가 필요하다. 원래 컬렉션 프레임워크에서 제공하는 toArray( ) 메서드는 참조형 객체의 변환만 지원하기 때문에 원시형 배열로 변환하려면 for 문을 써야 한다. 하지만 Set 인터페이스는 인덱스를 사용하지 않아서 get( ) 메서드를 사용할 수 없다. 따라서 Iterator 객체로 만든 다음에 각각 반환시켜 배열에 넣었다.

 

-  타인 답변 코드에서는 List 인터페이스를 사용했다. Set 인터페이스를 사용하는 것이 더 좋다고 판단되나, List 인터페이스를 사용해도 if 문과 contains( ) 메서드를 통해 중복 여부를 확인하는 로직이 흥미로워서 가져왔다.

 

-  내 코드와 타인 답변 코드에서 중첩 for 문을 보면 내 것보다 타인 답변 코드의 중첩 for 문에 더 직관적으로 보인다.