두 개 뽑아서 더하기

Kyu·2020년 12월 7일
0

알고리즘

목록 보기
1/7
post-thumbnail

테스트 케이스만 통과했음

https://programmers.co.kr/learn/courses/30/lessons/68644

먼저 든 생각은 그냥 직관적으로 이중 for문을 이용해서 모든 경우의 수를 더해서 중복값을 제거하는게 좋다고 생각했다.

이중 for문을 만들고나니 중복값을 어떻게 제거 할까 고민해보니 ArrayList에 remove메소드가 있었던 게 기억이 났다. 하지만 제거해도 제거한 값의 인덱스에 null값으로 남아있다는게 머리를 스쳐지나가서..다른 방법을 구글링 해보기로 했다.

검색으로 Set에 넣어주면 자동으로 중복이 제거된다는 사실을 알았다.

  • Set은 기본적으로 중복값을 허용하지 않고 순서가 없다. 수학에서의 집합과 같다.

그러니까, 이중 for문을 이용해서 모두 더한 값을 Set에 넣어준다. 앞에서 언급한것처럼 중복값은 들어가지 않는다.

return값으로 오름차순으로 배열에 담아 보내야하기 때문에 그 Set을 ArrayList에 담는다.

Set을 바로 primative int 배열로 할 수 있는 방법도 맨밑 참고 링크에 있는거 같으나 일단 자동적으로 변환해주진 않지만 for문을 이용해서 배열에 담는 방법을 택해서 문제를 풀었다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


class Solution {
    public int[] solution(int[] numbers) {
        
Set<Integer> set = new HashSet<Integer>();
        
        for (int i = 0; i < numbers.length; i++){
            for (int j = 0; j <numbers.length; j++){
                if(i != j){
                set.add(numbers[i] + numbers[j]);
                }
            }
        }
    
        List<Integer> ls = new ArrayList<Integer>(set);
    
        
        int[] answer = new int[ls.size()];
    for (int i = 0; i < answer.length; i++) {
        answer[i] = ls.get(i).intValue();
    }
    
        
        return answer;
    }
}

중복값제거 참고 : https://blog.naver.com/PostView.nhn?blogId=zzang9ha&logNo=221848934382&categoryNo=0&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView

List to Array 참고 : https://wakestand.tistory.com/183

  • 여기서 불운하게도 int와 같은 Primitive 타입의 배열과 Integer와 같은 Wrapper 타입의 List를 서로 바꿔줄 수는 없기 때문에 처음 생성 시 Integer로 생성하거나 해야 한다

ArrayList to Primative int 참고 : https://qastack.kr/programming/718554/how-to-convert-an-arraylist-containing-integers-to-primitive-int-array

Set to Array 참고 : https://codechacha.com/ko/java-convert-set-to-list-and-list-to-set/

profile
TIL 남기는 공간입니다

0개의 댓글