개발관련/코딩테스트

[프로그래머스 연습-1, level1 JAVA ] 두 개 뽑아서 더하기

90만식 2020. 12. 23. 22:56

1. 문제 설명

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


2. 나의 풀이

중복된 값을 어떻게 처리하는지와 모든 수를 배열에 오름차순으로 담는 것을 어떻게 해야 할지가 고민 됐다.

내 비루한 머리에서 나온 방법은 아래와 같다. 우선 HashMap을 사용해서 두 수를 더한 값을 key, value에 넣는다면 중복된 값은 해결할 수 있을 것 같았다. 문제는 오름차순으로 처리하는 것이었는데, 테스트 예제는 모두 통과 하기에 자동으로 정렬이 되는 줄만 알았다. 하지만 HashMap은 내부 hash 값에 따라 키 순서가 정해 지므로 특정 규칙 없이 출력된다고 한다. 그래서 HashMap이 아닌 TreeMap을 사용하여 오름차순 정렬을 처리했다.

import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;

class Solution {
    public int[] solution(int[] numbers) {
        // 두합을 더한 값을 저장할 TreeMap 객체 생성, 정렬을 위해 TreeMap사용
        TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();

        for(int i=0; i<numbers.length; i++) {
            for(int j=i+1; j<numbers.length; j++) {               
                // 현재의 i와 j 값을 더하는데 현재 i와 같은 값은 제외
                   int keyValue = numbers[i]+numbers[j] ;
                // hashmap의 key값이 중복되면 덮어쓰여지기 때문에 중복 값 고려 하지 않아도 된다.
                map.put( keyValue , keyValue);         
            }
        }

        // 배열 사이즈 지정
        int[] answer = new int[map.size()];
        // Iterator 사용 1 - keySet()을 사용하여 key 값 가져오기.
        Iterator<Integer> keys = map.keySet().iterator();

        int i=0;

        while (keys.hasNext()){
            Integer key = keys.next();
            // 가져온 key값과 value값이 동일하기 때문에 가져온 key값으로 value를 가져와서 배열에 넣는다.
            answer[i++] = map.get(key);
        }

        return answer;
    }
}

HashMap 사용 예제

  • HashMap의 Key 값 가져오기
HashMap<String, String> map = new HashMap<>();
map.put("key", "value");

// KeySet() : hashmap에 있는 키 값들은 집합(Set)의 형대로 반환한다.
// Iterator() : 반환된 집합 각각 데이터들을 순차검색 할 수 있도록 한다.
Iterator<String> keys = map.keySet().Iterator();

while( keys.hasNext() ){
   String key = keys.next();
   System.out.println( "key 값 : " + key);
}

TreeMap 정리

  • 이진트리 기반으로 한 Map 컬렉션.
  • 키와 값이 저장된 Map, Entry를 저장한다.
  • 데이터를 저장할 때 즉시 정렬하기 때문에 추가, 삭제가 HashMap보다 오래 걸린다.
  • 항상 정렬된 데이터를 조회해야 하는 경우 효율성이 좋다.
  • 추후에 정리 필요.

3. 다른 사람 풀이

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

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

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

 좋아요 26개를 받은 다른 사람의 풀이. 소스가 간결하고 깔끔했다. 위의 소스는 HashSet을 이용하여 중복을 제거했고 Stream을 사용하여 정렬 처리를 한 듯하다. Stream에 대해 잘 알지 못해 공부를 하고 추후에 따로 정리해 봐야겠다.

 

HashSet
  • HashSet의 가장 큰 장점은 중복을 자동으로 제거해준다.
  • HashSet은 자동 정렬을 해주지 않음.
  • 참조 블로그
 Stream