본문 바로가기
Language/Java

[Programmers | Java | 연습문제 풀이] 나누어 떨어지는 숫자 배열 - Solution with Arrays.copyOf() 또는 Stream API

by ㅇ달빛천사ㅇ 2024. 6. 20.
728x90

KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | Algorithm CODEKATA

🔢 나누어 떨어지는 숫자 배열

🏷 관련 주제 : 나머지 연산자 배열 복사 배열 자르기 배열 정렬




✔ Solution with Operator & Arrays.copyOf()

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] temp = new int[arr.length];
        int idx = 0;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) {
                temp[idx++] = arr[i];
            }
        }

        int[] answer;

        if (idx == 0) {
            answer = new int[1];
            answer[0] = -1;
        } else {
            answer = Arrays.copyOf(temp, idx);
            Arrays.sort(answer);
        }

        return answer;
    }
}
채점 결과


✔ Solution with Stream API

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = Arrays.stream(arr).filter(e -> e % divisor == 0).sorted().toArray();
        if (answer.length == 0) {
            answer = new int[1];
            answer[0] = -1;
        }

    return answer;
    }
}
채점 결과


💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍

📌 오늘 만난 문제 : 정수 배열 arr의 각 원소 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
단, divisor로 나누어 떨어지는 원소가 하나도 없다면 배열에 -1을 담아 반환하세요.


반복문을 통해 arr의 원소를 하나씩 꺼내 arri인덱스의 원소를 divisor로 나눈 나머지가 0이면
정수 배열 temp에 담아 문제의 조건을 만족하는 원소들을 담은 배열을 반환하려고 시도하였다.


그런데 temp의 길이를 확실히 알 수 없어서 반복문을 돌면서 divisor로 나누어지는 원소를 찾은 후, 바로 반환할 배열 answer에 담는 방법이 마땅치 않아 고민을 하였었다.
그런데 얼마 전 배열 복사 및 자르기에 대한 블로그 글에서 본 Arrays.copyOf()메서드가 떠올라서 이 메서드를 이용하기로 하였다.

  1. temp를 초기화 할 때는 arr의 길이와 같은 길이로 초기화를 한 후,
  2. temp에 원소를 담은 마지막 배열의 인덱스 idx의 크기에 따라
    • idx0이면
      (arrdivisor로 나누어 떨어지는 값이 없는 것이므로)
      answer을 길이 1인 배열로 초기화 하여 0번 인덱스에 -1을 할당하고 반환
    • idx0이 아니면
      Arrays.copyOf(배열, idx)를 사용하여
      answer에 divisor로 나누어지는 원소가 담긴 배열을 할당하고
      Arrays.sort()로 정렬 후 반환

이렇게 풀면 배열의 길이를 구하기 위해 반복문을 한번 돌고
배열에 원소를 담기 위해 반복문을 또 돌 필요가 없는 것이 좋다고 생각한다.


코드의 아래 부분을


if (idx == 0) {
    answer = new int[1];
    answer[0] = -1;
} else {
    answer = Arrays.copyOf(temp, idx);
    Arrays.sort(answer);
}

아래 코드로 고치는 것도 괜찮은 것 같다.

if (idx == 0) {
    temp[idx++] = -1;
}

answer = Arrays.copyOf(temp, idx);
Arrays.sort(answer);

💬 무엇을 새롭게 알았는지

  • 배열 복사 : Arrays.copyOf()
  • Stream API: filter()sorted()를 사용해 보았다.

📚 참고 자료

728x90


Top