알고리즘

프로그래머스 - 두 개 뽑아서 더하기

Heidong 2022. 7. 11. 16:01
반응형

 

내 풀이

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class P_37 {

    public int[] solution(int[] numbers) {
        ArrayList<Integer> list = new ArrayList<>();
        int check = 0;
        
        for(int i=0; i<numbers.length-1; i++) {
            for(int j=i+1; j<numbers.length; j++) {
                check = numbers[i] + numbers[j];    

                if(! list.contains(check)) {
                    list.add(check);
                }
            }
        }
        Collections.sort(list);

        int[] answer = list.stream().mapToInt(Integer::intValue).toArray();
        
        return answer;
    }


    public static void main(String[] args) {
        // 두 개 뽑아서 더하기

        P_37 p = new P_37();
        int[] x = {2,1,3,4,1};
        System.out.println(Arrays.toString(p.solution(x)));
    }
}

 

sort(), contains()를 사용하기 위해서 배열 형태가 아니라 리스트 형태로 풀었다.

Integer의 리스트를 int 배열로 돌리기에는 반복문아니면 stream을 통한 람다로 풀어야 한다.

 

 

다른 사람 풀이

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

HashSet -> 중복을 허용하지 않음.

중복값을 HashSet에 값을 add해도 추가가 되지 않음.

 

Set의 클래스중 하나인 HashSet 말고 TreeSet을 사용해도 된다.

HashSet과 TreeSet의 차이점으로는 HashSet보다 TreeSet이 추가, 삭제는 느리지만 검색과 정렬은 더 유리하다.

 

https://coding-factory.tistory.com/555

 

[Java] 자바 TreeSet 사용법 & 예제 총정리

TreeSet이란? JDK 1.2부터 제공되고 있는 TreeSet은 HashSet과 마찬가지로 Set 인터페이스를 구현한 클래스로써 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않는다는 Set의 성질을 그대로 가

coding-factory.tistory.com

 

다른 사람 풀이2

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;

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

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

        Iterator<Integer> iter = set.iterator();
        while(iter.hasNext()) {
            answer.add(iter.next());
        }

        Collections.sort(answer);
        return answer;
    }
}

마찬가지로 Set을 이용한 풀이 방법.

Iterator를 사용해서 객체 자체를 가져와서 while문으로 돌린 모습.

정렬을 하기 위해서 list에 담은 모습인데 stream을 활용하여 sorted()를 사용했다면 더 간결하게 표현이 가능 했을 것이다.

 

반응형