[JAVA] 나누어 떨어지는 숫자 배열

태히·2021년 1월 21일
0

코딩테스트 연습

목록 보기
5/9

문제 설명

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

제한사항

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

처음 떠오른 생각

이 전에 풀어봤던 '같은 숫자는 싫어!'문제처럼 우선!
arr를 가공해서 다른배열로 복사해야되고 --> 그러기위해선 count를 사용하여 복사할 배열의 크기를 구한다. --> 이번엔 배열복사 메소드를 사용하여 복사하겠다. --> 오름차순 정렬도 해야된다.

코드 구현

class Solution{
    public int[] solution(int[] arr, int divisor){
        int count=0;
        int[] tmp = new int[arr.length];
        
        for(int i=0; i<arr.length; i++){
            if((arr[i] % divisor)==0){
                tmp[i]=arr[i];
                count++;
            }
        }
        
        if(count!=0){
            int[] answer = new int[count];
            int temp=0;
            int min=0;
            int srcpos=0;

            for(int i=0; i<tmp.length-1; i++) {//tmp배열 정렬
                min=i;
                for(int j=i+1; j<tmp.length; j++){
                    if(tmp[min]>tmp[j]) {
                        min = j;
                    }
                }
                if(min!=i){
                    temp=tmp[i];
                    tmp[i]=tmp[min];
                    tmp[min]=temp;
                }
                if(tmp[i]==0){
                    srcpos++;
                }
            }

            System.arraycopy(tmp, srcpos, answer, 0, count);

            for(int k : answer){
                System.out.println(k);
            }
            return answer;
        }
        else{//나누어 떨어지는 원소가 없을때
            int[] answer = {-1};
            return answer;
        }
    }
}

코드를 설명하자면
맨 위의 for문은 divisor로 나눠지는 값이 있으면 임시배열tmp[]에 넣어주고 count++을 해준다.
여기서 count는 나눠지는 숫자가 있다면 카운팅 해 복사받을 answer[]배열의 크기를 결정해준다.
그리고 밑에 코드는 선택정렬 알고리즘을 활용하여 오름차순 정렬을 했다.
마지막으로 System.arraycopy()메소드를 사용해 배열 복사를 했다.

REIVEW

이번 문제의 리뷰는 사실 별거없다.
다른사람들의 코드를 보면 대부분 2년, 3년전에 올라온 코드들이 많은데 정렬이 필수임에도 불구하고 통과된 사람들이 꽤 있었다. 알고보니 문제가 바뀌었기 때문이었다. 그래서 비교해볼 코드가 많지 않았다. 사실 배열문제에 List를 쓰면 편하긴 할 것 같다. List를 쓴 사람이 많이 보였다. 다음 배열 문제에는 라이브러리를 착실히 사용해보겠다.

후기

이렇게 써놓고 보니 진짜 별거 없다. 정렬코드를 빼고 보면 for문 하나밖에 없다. 내 실력이 늘은게 아니라 문제가 쉬웠던 것이겠지... 자만하지 말고 겸손해지자.

GITHUB 주소 : 나누어 떨어지는 숫자 배열_giturl

profile
하고싶은게 많은 개발자가 되고싶은

0개의 댓글