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

김하밍·2024년 6월 29일

알고리즘

목록 보기
22/22

문제

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

풀이 과정

문제를 해석하고 작성한 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}; 라는 코드가 생소했습니다.
    많이 작성해보지 않은, 조금 변형된 코드도 응용하고 해석할 줄 아는 연습이 필요하다고 느꼈습니다.

profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글