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

이진용·2023년 3월 15일
0

문제 설명

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

제한사항

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

입출력 예

생각해보기

  Stream을 쓰면 굉장히 쉽게 풀 수 있을 것 같다.
  그럼 Stream으로도 풀어보고 Array만 써서도 풀어보자.
  Array만 써서 풀 때는 성능을 최대한 고려해보자.

코드

Stream 사용 시

// Stream 사용 시
import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] result = Arrays.stream(arr)
            .filter(i -> i%divisor == 0)
            .sorted()
            .toArray();
        return result.length == 0 ? new int[]{-1} : result;
    }
}

Kotlin이었다면 비어있는 지 검사하는 로직도 스트림에 포함시킬 수 있었을 텐데 아쉽다.

Array만 사용한다면 + 성능 고려

// Array만 사용한다면 + 성능 고려
import java.util.*;

public class Solution {
    public int[] solution(int[] arr, int divisor) {
        int curr = 0;
        int last = arr.length;
        while(true) {
            if(curr == last || curr > arr.length) break;
            if (arr[curr] % divisor == 0) {
                curr++;
                continue;
            }
            int start = curr;
            int end = start + 1;
            while (end < last && arr[end] % divisor != 0) {
                end++;
            }
            moveLeft(arr, start, end, last);
            last -= end - start;
        }
        if(last < 1) return new int[]{-1};
        int[] result = new int[last];
        System.arraycopy(arr, 0, result, 0, last);
        Arrays.sort(result);
        return result;
    }

    public void moveLeft(int[] arr, int start, int end, int last) {
        for(;end < last;) {
            arr[start++] = arr[end++];
        }
    }

}

한 번의 루프 안에서 해결하고자 했다.
while을 두 개 썼지만 index는 한 번만 루프를 돈다.

코드 가독성이 굉장히 떨어지지만 성능은 확실히 낫다.

마무리

Stream 짱짱맨

profile
멋있는 개발자가 되어야지.

0개의 댓글