728x90
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
- 후에 정리 필요
- 참조 블로그
728x90
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[LeetCode-pascals triangle]파스칼의 삼각형, JAVA 구현 (0) | 2021.10.25 |
---|---|
[LeetCode-Merge Sorted Array]정렬된 배열의 병합, JAVA 구현 (0) | 2021.10.23 |
[백준-3273번]두 수의 합 (0) | 2021.10.17 |
[프로그래머스-3, level 1 JAVA] 문자열을 정수로 바꾸기 (0) | 2021.01.17 |
[프로그래머스-2, level 1 완전탐색] 모의고사 (0) | 2021.01.17 |