ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 Lv.1] 두 개 뽑아서 더하기 java
    DEV/알고리즘 2020. 9. 15. 14:05

    문제설명

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

     

    제한사항

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

     

    입출력 예

    numbers result
    [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 해야 합니다.

     

    Solution

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    import java.util.*;
     
    class Solution {
        static List<Integer> list = new ArrayList<Integer>();
        //n개중r개 뽑기
        public int[] solution(int[] numbers) {
            int[] answer = {};
            int n = numbers.length;
            int r = 2;
            boolean[] visited = new boolean[n];
            comb(numbers, visited, 0, n, r);
            answer = new int[list.size()];
            for(int i=0; i<list.size(); i++) {
                answer[i] = list.get(i);
            }
            Arrays.sort(answer);
            //System.out.println(Arrays.toString(answer));
            return answer;
        }
        
        static void comb(int[] numbers, boolean[] visited, int depth, int n, int r) {
            if (r == 0) {
                cal(numbers, visited, n);
                return;
            }
            
            if (depth == n) {
                return;
            }
     
            visited[depth] = true;
            comb(numbers, visited, depth + 1, n, r - 1);
     
            visited[depth] = false;
            comb(numbers, visited, depth + 1, n, r);
        }
        
        static void cal(int[] arr, boolean[] visited, int n){
            int num = 0;
            for (int i = 0; i < n; i++) {
                if (visited[i]) {
                    num += arr[i];
                }
            }
            if(!list.contains(num)) {
                 list.add(num);
              }
            
        }
    }
    cs

     

     

     

    참고 : bcp0109.tistory.com/15

     

    조합 Combination (Java)

    조합 연습 문제 조합이란 n  개의 숫자 중에서 r  개의 수를 순서 없이 뽑는 경우를 말합니다. 예를 들어 [1, 2, 3]  이란 숫자 배열에서 2개의 수를 순서 없이 뽑으면 [1, 2] [1, 3] [2, 3] 이렇게 3 개가

    bcp0109.tistory.com

    코딩챌린지에서 문제를 보자마자 얼마전에 공부한 조합이 생각나 바로 적용시켜서 풀었는데,

    다른사람들의 풀이를 보니 이렇게 간단하게 풀 수도 있구나 싶었다 .. OTL ..

     

    다른사람풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
     
    class Solution {
        public int[] solution(int[] numbers) {
            Set<Integer> sumNumber = new TreeSet();
     
            for(int i = 0; i < numbers.length-1; i++){
                for(int j = i+1; j < numbers.length; j++){
                    sumNumber.add(numbers[i] + numbers[j]);
                }
            }
     
            int[] answer = new int[sumNumber.size()];
            int index = 0;
            Iterator itor = sumNumber.iterator();
            while(itor.hasNext()){
                answer[index] = (int)itor.next();
                index++;
            }
     
            return answer;
        }
    }
    cs

     

    배열의 모든 수를 더하여 중복저장이 되지않으면서 자동 정렬해주는 TreeSet에 넣어주고있다.

    깔-꼼

    댓글

Designed by Tistory.