본문 바로가기

코딩 테스트

[프로그래머스] (Lv.1) 나누어 떨어지는 숫자 배열

728x90

문제


array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요

divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

<  제한사항  >

 

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

 

-  출력 예시  -

정답 코드


<  내 정답 코드  >

class Solution {
    public int[] solution(int[] arr, int divisor) {
        List<Integer> list = new ArrayList<>();
        
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) {
                list.add(arr[i]);
            }
        }
        
        if (list.size() == 0) {
            return new int[] {-1};
        }
        
        Collections.sort(list);
        int[] resultArr = new int[list.size()];
        
        for (int i = 0; i < list.size(); i++) {
            resultArr[i] = list.get(i).intValue();
        }
        
        return resultArr;
    }
}

 

< 리팩터링 이후 코드 >

class Solution {
    public int[] solution(int[] arr, int divisor) {
        List<Integer> answerList = divideNumber(arr, divisor);
        isEmpty(answerList);

        Collections.sort(answerList);
        return listToArray(answerList);
    }
    
    private static int[] listToArray(List<Integer> answerList) {
        int[] tempAnswer = new int[answerList.size()];
        for (int i = 0; i < tempAnswer.length; i++) {
            tempAnswer[i] = answerList.get(i);
        }
        return tempAnswer;
    }
    
    private static void isEmpty(List<Integer> answerList) {
        if (answerList.isEmpty()) {
            answerList.add(-1);
        }
    }
    
    private static List<Integer> divideNumber(int[] arr, int divisor) {
        List<Integer> tempList = new ArrayList<>();

        for (int i = 0; i < arr.length; i++) {
            int number = arr[i];
            checkNumber(tempList, number, divisor);
        }
        return tempList;
    }
    
    private static void checkNumber(List<Integer> tempList, int number, int divisor) {
        if (number % divisor == 0) {
            tempList.add(number);
        }
    }
}

 

<  타인 답변 코드  >

class Divisible {
    public int[] divisible(int[] array, int divisor) {
        int[] temp = new int[array.length];

        int i = 0;
        for(int d : array){
            if(d % divisor == 0){
                temp[i] = d;
                ++i;
            }
        }

        int[] ret = new int[i];
        System.arraycopy(temp, 0, ret, 0, ret.length);

        return ret;
    }
}

이것을 주의하자!


-  배열은 한 번 만들어진 크기를 변경할 수 없으므로 몇 개의 수가 저장될지 모르는 초반에 ArrayList< Integer > 을 만들었고, 해당 조건에 맞는 원소들을 저장했다. 그리고 정렬 메서드를 사용한 다음에 하나씩 꺼내서 int [ ]  배열에 저장한 다음 반환했다.

 

배열을 리스트로 바꾸는 메서드 'Arrays.asList( )'는 오토박싱 기능이 없다. 따라서 String 또는 다른 객체로 이뤄진 배열을 리스트로 바꿔줄 수는 있지만, int , long , float, char 같은 원시형(primative) 배열은 제대로 변환이 안된다. 따라서 원시형 배열을 리스트로 변환하려면 순수 for 문을 이용해 대입해줘야 한다.

 

리스트를 원시형(primative) 배열로 바꿀때도 toArray( ) 메서드가 아닌, for 문으로 하나씩 배열에 대입해줘야 한다. 이때 intValue( ) 메서드를 사용하지 않아도 자동으로 Integer 형에서 int 형으로 전환된다.

 

-  타인 답변 코드에서는 컬렉션 프레임워크를 사용하지 않고, 배열의 복사 기능으로만 풀었다. 이것도 참신해서 가져왔다.