본문 바로가기
[JAVA] 프로그래머스 LEVEL1

[JAVA] 나누어 떨어지는 숫자 배열 - ArrayList, 배열, 람다식

by devjapan 2025. 6. 4.
728x90

1. 문제

주어진 배열 arr에서 각 원소 중 divisor로 나누어 떨어지는 숫자들만 골라서, 오름차순으로 정렬한 배열을 반환하는 문제입니다.

중요한 점은, 나누어 떨어지는 숫자가 하나도 없다면 [ -1 ]을 반환해야 한다는 점입니다. 단순히 나눌 수 있는 숫자를 찾는 것이 아니라, 정렬 조건과 예외 처리까지 함께 고려해야 합니다.

  • [5, 9, 7, 10]에서 5로 나누어 떨어지는 수는 5와 10 → 결과: [5, 10]
  • [3, 2, 6]에서 10으로 나누어 떨어지는 수는 없음 → 결과: [-1]

🔒 제한사항 요약

  • 배열 arr의 길이: 1 이상
  • 배열 내 원소: 서로 다른 자연수
  • divisor: 자연수
  • 출력 배열은 오름차순 정렬되어 있어야 하며, 나눌 수 있는 값이 없다면 [ -1 ]만 포함해야 함

2. 풀이 코드

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        List<Integer> list = new ArrayList<>(); 
        for(int i=0; i<arr.length;i++){
            if(arr[i]%divisor==0){
                list.add(arr[i]);
            }
        }
        if(list.isEmpty()){
            list.add(-1);
        }
        list.sort(null); // 오름차순 정렬
        int[] answer = new int[list.size()];
        for(int i=0; i<list.size();i++){
            answer[i] = list.get(i); // 리스트의 원소를 배열에 넣기
        }
        return answer;
    }
}

3. 코드 풀이

List<Integer> list = new ArrayList<>();
  • 나누어 떨어지는 값을 임시로 담기 위한 리스트를 생성합니다.
for (int i = 0; i < arr.length; i++) {
    if (arr[i] % divisor == 0) {
        list.add(arr[i]);
    }
}
  • 주어진 배열 arr을 순회하면서 divisor로 나누어 떨어지는 값만 list에 추가합니다.
if (list.isEmpty()) {
    list.add(-1);
}
  • 나누어 떨어지는 값이 하나도 없다면 리스트에 -1을 추가합니다.
list.sort(null);
  • null을 인자로 주면 자연 정렬(오름차순 정렬)이 수행됩니다.
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    answer[i] = list.get(i);
}
  • 리스트의 요소들을 다시 int[] 배열로 옮깁니다.
 

4. 이 코드에서 나온 개념 정리

이번에 나온 코드들은 이미 이전에 다 정리한 부분이라 혹 관련 개념들을 보고 싶은 분들은 아래 포스트를 확인해주세요.

 

1) ArrayList 관련 정리

2025.06.04 - [[JAVA] 프로그래머스 LEVEL1] - [JAVA] 같은 숫자는 싫어 - ArrayList, List 관련 메서드 정리

 

2) % 연산자

2025.06.03 - [[JAVA] 프로그래머스 LEVEL1] - [JAVA] 2016년 - Array 배열, %연산자


5. 다른 사람들의 코드

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> tempList = new ArrayList<Integer>();
        int preNum = 10;
        for(int num : arr) {
            if(preNum != num)
                tempList.add(num);
            preNum = num;
        }       
        int[] answer = new int[tempList.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i] = tempList.get(i).intValue();
        }
        return answer;
    }
}

 

 

✅ 이 코드의 장점

항목 설명
✅간결성 한 줄의 stream 처리로 필터링과 배열 반환까지 모두 수행
✅ 가독성 로직이 간단하여 전체 흐름을 빠르게 파악 가능
✅ 함수형 스타일 Java의 함수형 프로그래밍 문법을 활용해 현대적인 코드 작성 방식 반영
 

🔍 이 코드로 부터 배울 수 있는 개념

개념 설명 예시
Arrays.stream() 배열을 스트림으로 변환 Arrays.stream(array)
.filter(predicate) 조건을 만족하는 요소만 통과시킴 .filter(x -> x % 3 == 0)
.toArray() 스트림을 다시 배열로 변환 .toArray()
람다식 함수형 인터페이스를 간단히 표현하는 방법 x -> x % divisor == 0
 

📌 원래 코드와 비교 요약

항목 내 코드 다른 사람 코드
가독성 다소 장황함 매우 간결하고 직관적
유연성 리스트로 조건 없는 값도 처리 가능 (예: -1 처리 포함) -1 처리 없음 → 로직에 따라 후처리 필요
기능성 오름차순 정렬까지 포함 정렬 없음, 필터만 수행
성능 측면 O(n) + 정렬 O(n log n) O(n) 필터링만 수행 (단, -1 처리 미포함)
코드 스타일 명령형 스타일 함수형/선언형 스타일

 

 


 

💡 누가 더 잘했는가?

관점 승자 이유
문제 요구사항 충족 내 코드 정렬, -1 처리까지 포함된 완성형
코드 간결성 다른 사람 코드 Stream + 람다식으로 깔끔한 구성
학습 측면 내 코드 문제 풀이의 전체 흐름을 스스로 구현해보기 적합
실무적 활용 다른 사람 코드 Java 8 이상 환경에선 유지보수와 재사용 측면에서 유리 (단, -1 조건은 추가 필요)
 
728x90