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
'[JAVA] 프로그래머스 LEVEL1' 카테고리의 다른 글
| [JAVA] 두 정수 사이의 합 - 반복문, 등차수열 (2) | 2025.06.04 |
|---|---|
| [JAVA] 같은 숫자는 싫어 - ArrayList, List 관련 메서드 정리 (0) | 2025.06.04 |
| [JAVA] 가운데 글자 가져오기 - 문자열 인덱스 총 정리 (2) | 2025.06.04 |
| [JAVA] 2016년 - Array 배열, %연산자 (0) | 2025.06.03 |
| [JAVA] 폰켓몬 - 삼항연산자, 이중 for문, HashSet (0) | 2025.06.03 |