[프로그래머스] 두개 뽑아서 더하기(JAVA)-Level1

hsnam·2022년 1월 9일
0

프로그래머스

목록 보기
1/20
post-thumbnail

두개 뽑아서 더하기

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

제한사항

numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예

numbersresult
[2,1,3,4,1][2,3,4,5,6,7]
[5,0,2,7][2,5,7,9,12]

입출력 예 설명
입출력 예 #1
2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
3 = 2 + 1 입니다.
4 = 1 + 3 입니다.
5 = 1 + 4 = 2 + 3 입니다.
6 = 2 + 4 입니다.
7 = 3 + 4 입니다.
따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
입출력 예 #2
2 = 0 + 2 입니다.
5 = 5 + 0 입니다.
7 = 0 + 7 = 5 + 2 입니다.
9 = 2 + 7 입니다.
12 = 5 + 7 입니다.
따라서 [2,5,7,9,12] 를 return 해야 합니다.

JAVA

  • CASE 1(ArrayList를 이용한 문제 해결)
import java.util.ArrayList;
import java.util.Collections;
    class Solution {
    	public int[] solution(int[] numbers) {

        ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int i=0; i<numbers.length; i++) {
            for(int j=1+i; j<numbers.length; j++) {
                int temp = numbers[i] + numbers[j];
                if(!arr.contains(temp)) {
                    arr.add(temp);
                }
            }
        }
        Collections.sort(arr);
        return arr.stream().mapToInt(i->i).toArray();
      }
	}
- 결과

```
테스트 1 〉	통과 (2.11ms, 74.5MB)
테스트 2 〉	통과 (2.80ms, 81.3MB)
테스트 3 〉	통과 (2.60ms, 75.3MB)
테스트 4 〉	통과 (2.11ms, 79.6MB)
테스트 5 〉	통과 (2.01ms, 76.5MB)
테스트 6 〉	통과 (3.39ms, 77.1MB)
테스트 7 〉	통과 (6.50ms, 76.6MB)
테스트 8 〉	통과 (3.47ms, 73.7MB)
테스트 9 〉	통과 (2.51ms, 75.8MB)
```

- CASE2
(TreeSet을 이용한 문제 해결)

```
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;

class Solution {
	public int[] solution(int[] numbers) {
    	Set<Integer> treeSet = new TreeSet<Integer>();
        for (int i = 0; i < numbers.length; i++) {
        	for (int j = 1 + i; j < numbers.length; j++){
                    int temp = numbers[i] + numbers[j];
                    treeSet.add(temp);
                }
            }
       	return treeSet.stream().mapToInt(i->i).toArray();
        }
    }
```

- 결과
```
테스트 1 〉	통과 (2.38ms, 71.8MB)
테스트 2 〉	통과 (3.26ms, 77.8MB)
테스트 3 〉	통과 (3.26ms, 80.5MB)
테스트 4 〉	통과 (2.37ms, 77.8MB)
테스트 5 〉	통과 (2.36ms, 74.3MB)
테스트 6 〉	통과 (3.72ms, 78.6MB)
테스트 7 〉	통과 (4.22ms, 77MB)
테스트 8 〉	통과 (4.15ms, 81.7MB)
테스트 9 〉	통과 (5.49ms, 78.8MB)
```

풀이

  • 입력받은 배열을 이중 for문을 이용하여 모든 경우의 수를 구하여 두합의 결과를 구한다.
  • 결과의 중복 여부를 판단하여 배열에 저장하고 Sort하여 결과를 반환한다.
  • Case1
    - ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트. 일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점등이 유사하지만 한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다는 특징을 가지고 있다. 또한 배열의 값에 중복을 허용한다.
    - ArrayList로 구현할 경우 중복 여부를 판단해서 입력해야 하며 자동으로 오름차순으로 정렬되지 않기때문에 Collections.sort()를 이용하여 오름차순으로 정렬해야 해야 한다.
  • Case2
    - TreeSet은 Set 인터페이스를 상속받은 클래스로 데이터에 대한 중복저장을 하지 않으며 저장된 순서를 보장하지 않는다.
    - TreeSet로 구현할 경우 중복 여부 판단할 필요도 없고 오름차순으로 정렬되어 정렬에 대해서 구현하지 않아도 된다.

0개의 댓글