■ 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/68644
코딩테스트 연습 - 두 개 뽑아서 더하기
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한
programmers.co.kr
■ 소스코드
▶ Map
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
class Solution {
public int[] solution(int[] numbers) {
Map<Integer, Integer> hashMap = new HashMap<>();
for(int i=0;i<numbers.length;i++) {
for(int j=0;j<numbers.length-1;j++) {
if(i==j) {
break;
}else {
hashMap.put(numbers[i]+numbers[j], hashMap.getOrDefault(numbers[i]+numbers[j], 1)+1);
}
}
}
Iterator<Integer> iterator = hashMap.keySet().iterator();
int[] answer=new int[hashMap.size()];
int i=0;
while(iterator.hasNext()) {
answer[i]=iterator.next();
i++;
}
Arrays.sort(answer);
return answer;
}
}
▶ Set
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Solution {
public static int[] solution(int[] numbers) {
Set<Integer> hashSet = new HashSet<>();
for(int i=0;i<numbers.length;i++) {
for(int j=0;j<numbers.length-1;j++) {
if(i==j) {
break;
}else {
hashSet.add(numbers[i]+numbers[j]);
}
}
}
Iterator<Integer> iterator = hashSet.iterator();
int[] answer=new int[hashSet.size()];
int i=0;
while(iterator.hasNext()) {
answer[i]=iterator.next();
//System.out.println(iterator.next());
i++;
}
Arrays.sort(answer);
return answer;
}
}
■ 풀이
주어진 배열 numbers의 해당 요소를 제외한 요소와의 합을 구할 수 있는 모든 경우를 배열화하고 오름차순으로 정렬하여 리턴하는 문제이다.
(배열 내에서 요소끼리 비교를 하거나 연산을 하는 경우에 중첩 반복문으로 주로 처리해왔는데 혹시 다른 방법이 있다면 빨리 발견했으면....)
중첩된 반복문에 반복 종료 조건을 numbers배열과 같거나 커진 경우로 설정을 하고 인덱스가 같은 요소는 map에 저장하지 않도록 했다.
map의 특징인 key는 중복되지 않는다는 점을 활용해서 요소 간 합을 key로 그리고 그 조합이 몇 번 나왔는지 카운팅 해서 value에 저장하도록 했다.(value는 쓰이지 않음) value의 값은 전혀 필요하지 않으므로 합들 중 같은 결과 값이 나올 때마다 key와 value에 +1 한 값으로 업데이트시켜줬다.
Iterator를 사용해서 리턴할 배열 answer에 담아주고 Arrays클래스의 sort( ) 메서드를 이용해서 배열을 오름차순으로 정렬해준 후 리턴했다.
(Set의 경우도 로직은 같다.)
■ 후기
Map도 Set(키) + Array(값) 구조라서 그런지 시간이나 메모리의 차이가 크진 않은 것 같아보인다.
잘못된 점이나 보충할 부분이 있으면 코멘트 남겨주세요
작은 조언이 저에겐 성장의 원동력이 됩니다 :-)
'알고리즘' 카테고리의 다른 글
[데알] 프로그래머스 알고리즘 Lesson.68935 3진법 뒤집기 (Java) (0) | 2020.11.18 |
---|---|
[데알] 프로그래머스 알고리즘 Lesson.42576 완주하지 못한 선수 (Java) (0) | 2020.11.17 |
[데알] 백준 알고리즘 No. 2577 숫자의 개수 (Python) (0) | 2020.11.15 |
[데알] 백준 알고리즘 No. 11654 아스키코드(Python) (0) | 2020.11.14 |
[데알] 백준 알고리즘 No. 2750 수 정렬하기(Java) (0) | 2020.11.13 |
댓글