문제를 해석하고 작성한 To do:
1. arr 배열 순회해서 divisor로 나누어 떨어지는 요소 개수 세어서 그 크기로 answer 빈 배열 생성하기
2. arr 배열 순회해서 divisor로 나누어 떨어지는 요소 찾아서 answer에 담기
3. arr 배열 순회해서 divisor로 나누어 떨어지는 요소 개수 세어서 그 개수가 0이면 answer에 -1 만 담기
요약하자면,
(1) 나누어 떨어지는 요소가 없다면 -1이 담긴 배열 반환
(2) 나누어 떨어지는 요소가 있다면 그 요소의 개수만큼의 크기 배열을 생성하고, 해당하는 요소들을 담아서 반환
여기서 나누어 떨어지는 요소의 개수를 셀 변수가 필요합니다.
또 고려할 점은 arr를 순회할 때마다 answer 인덱스가 증가하지 않습니다. arr에서 해당하는 요소를 발견할 때마다 answer에 담고, 담겼을 때만 인덱스를 증가시켜줘야하므로 ++ 해줄 변수가 필요합니다.
총 2번의 리턴이 발생할 예정입니다.
public static int[] solution(int[] arr, int divisor) {
int count = 0;
int number = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) {
count++;
}
}
if (count == 0) {
int[] answer = {-1};
return answer;
}
int[] answer = new int[count];
for (int i = 0; i < arr.length; i++) {
if (arr[i] % divisor == 0) {
answer[number] = arr[i];
number++;
}
}
Arrays.sort(answer);
return answer;
}
public static int[] solution(int[] arr, int divisor) {
int[] answer = Arrays.stream(arr)
.filter(num -> num % divisor == 0) // 조건에 맞는 요소만 필터링
.sorted() // 오름차순 정렬
.toArray(); // 결과를 배열로 변환
// 필터링된 결과가 없다면 -1을 담은 배열 반환
if (answer.length == 0) {
return new int[] {-1};
}
// 필터링된 결과 반환
return answer;
}
스트림을 사용하면 변수를 사용하지 않을 수 있다는 이점을 느꼈습니다.
배열을 로직 작성하기 시작할 때 한 번만 만들기만 했었는데, 이미 담긴 값이 아닌 다른 조건에 따른 배열을 즉시 만들어서 리턴해야할 때 return new int[] {-1}; 라는 코드가 생소했습니다.
많이 작성해보지 않은, 조금 변형된 코드도 응용하고 해석할 줄 아는 연습이 필요하다고 느꼈습니다.