코딩테스트/프로그래머스

[프로그래머스] 나누어 떨어지는 숫자 배열

블로그 주인장 2023. 8. 9.

 

[ 목차 ]


    📢 문제 출처

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr


    📢 문제 설명

    • array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

    📢 입출력 예시

    arr divisor return
    [5, 9, 7, 10] 5 [5, 10]
    [2, 36, 1, 3] 1 [1, 2, 3, 36]
    [3,2,6] 10 [-1]
    • 입출력 예 #1
    • (1) arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
    • 입출력 예 #2
    • (1) arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
    • 입출력 예 #3
    • (1) 3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

    📢 풀이

    📌 1번 풀이 (feat. ArrayList)

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] arr, int divisor) {
    
            ArrayList<Integer> iArr = new ArrayList<>();
    
           for (int i = 0; i < arr.length; i++) {
                if(arr[i] % divisor == 0)
                {
                    iArr.add(arr[i]);
                }
            }
            
            int[] answer = {};
            if(iArr.size() != 0) {
                iArr.sort(Comparator.naturalOrder());   //오름차순 정렬
                answer = new int[iArr.size()];
                for (int i = 0; i < answer.length; i++) {
                    answer[i] += iArr.get(i);
                }
            }
            else
            {
                answer = new int[1];
                answer[0] = -1;
            }
    //        System.out.println("answer = " + Arrays.toString(answer));
       
    
            return answer;
        }
    }
    • ArrayList를 선언 후에 int 배열 수만큼 반복문을 돌려서 divisor 나눴을 때 0이면 ArrayList에 값을 삽입
    • 삽입 후에 만약 값이 있으면 배열을 오름차순 정렬 하고, answer에 값을 넣어준다.
    • 삽입 후에 만약 값이 0이면 answer에 -1을 넣어서 리턴

    📌 2번 풀이 (feat. Stream)

    import java.util.Arrays;
    
    class Solution {
      public int[] solution(int[] arr, int divisor) {
              int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
              if(answer.length == 0) answer = new int[] {-1};
              java.util.Arrays.sort(answer);
              return answer;
      }
    }
    • Arrays.stream.filter를 이용해서 answer라는 배열 선언
    • 배열 선언 후에 값이 없으면 -1 리턴
    • 아닐 시에는 배열을 sorting 하여 진행

    📌 3번 풀이 (feat. 기본 배열)

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] arr, int divisor) {
            int[] answer = {};
            int count1 = 0;  //나누어떨어지는 카운트
            for (int i = 0; i < arr.length; i++) {
                if(arr[i] % divisor == 0){
                    count1++;
                }
            }
            
            //나누어 떨어지는 값이 없으면
            if(count1 == 0)
            {
                answer = new int[1];
                answer[0] = -1;
                return answer;
            }
    
            int count2 = 0; //결과를 출력해야하는 배열의 인덱스
            answer = new int[count1];
            for (int i = 0; i < arr.length; i++) {
                if(arr[i] % divisor == 0){
                    answer[count2] = arr[i];
                    count2++;
                }
            }
            
            //오름차순 정렬
            int tmp = 0;
            for (int i = 0; i < answer.length; i++) {
                for (int j = 0; j < answer.length - 1; j++) {
                    if(answer[j] > answer[j + 1])
                    {
                        tmp = answer[j];
                        answer[j] = answer[j + 1];
                        answer[j + 1] = tmp;
                    }
                }
            }
            
            return answer;
        }
    }
    1. 처음엔 arr의 배열 인덱스 값을 받아서 divisor에 나눴을 때 나누어 떨어지는 지 체크한다.
    2. 만약 나누어떨어지는 게 없으면 -1로 리턴한다.
    3. 나누어떨어진 카운트 만큼 배열을 하나 생성하여 인덱스가 나누어떨어질 때의 Value를 배열에 삽입한다.
    4. 그 후 오름차순을 진행한다.
    5. tmp를 하나 생성해서,  (현재 인덱스)보다 (인덱스 위치 +1)가 크면 해당 인덱스에 큰 값을 넣어준다.

    📢 후기

    • ArrayList로 하는 경우와 배열을 이용한 경우 2가지로 해당 경우를 만족하게 만들어봤는데, 솔직하게 ArrayList는 sort를 이용해서 간편하게 만든 경우이고, 배열의 경우는 하나하나 값을 넣었는데, 배열로 구현하는 게 엄청 어려운 거 같다.

    반응형

    댓글