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의 원소를 하나씩 꺼내
arr의 i인덱스의 원소를 divisor로 나눈 나머지가 0이면정수 배열
temp에 담아 문제의 조건을 만족하는 원소들을 담은 배열을 반환하려고 시도하였다.그런데
temp의 길이를 확실히 알 수 없어서 반복문을 돌면서 divisor로 나누어지는 원소를 찾은 후, 바로 반환할 배열 answer에 담는 방법이 마땅치 않아 고민을 하였었다.그런데 얼마 전 배열 복사 및 자르기에 대한 블로그 글에서 본
Arrays.copyOf()메서드가 떠올라서 이 메서드를 이용하기로 하였다.temp를 초기화 할 때는arr의 길이와 같은 길이로 초기화를 한 후,temp에 원소를 담은 마지막 배열의 인덱스idx의 크기에 따라idx가0이면
(arr에divisor로 나누어 떨어지는 값이 없는 것이므로)
answer을 길이 1인 배열로 초기화 하여0번 인덱스에-1을 할당하고 반환idx가0이 아니면
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