문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/12910
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한 사항
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
입출력 예
arr | divisor | return |
[5, 9, 7, 10] | 5 | [5, 10] |
[2, 36, 1, 3] | 1 | [1, 2, 3, 36] |
[3,2,6] | 10 | [-1] |
코드
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
Arrays.sort(arr);
List<Integer> list = new ArrayList<>();
for(int i : arr){
if(i % divisor == 0) list.add(i);
}
if(list.size() == 0){
return new int[] {-1};
}
int [] answer = new int [list.size()];
int index = 0;
for(int i : list){
answer[index] = list.get(index);
index++;
}
return answer;
}
}
배열의 크기를 알아보기 위해 for문을 한번 더 돌리는 것보다 List로 만들고 하나씩 담아주는 게
가독성이나 속도면에서 빠를 거 같아서 List 풀이를 선택.
list의 크기대로 배열을 만들어주고 하나씩 담아서 정답 풀이로 냈다.
사담
문제를 풀면서 get해서 하나씩 담는 것보다 리스트를 배열로 바꾸는 메소드가 있지 않을까 싶었는데
다른 사람 정답 풀이를 보고 구글링을 해도 스트림으로 쓰는 것말곤 찾을 수가 없었다...
찾다찾다 어느 글에서 list.toArray(new int [list.size()] 라는 메소드를 쓰면 된다고 해서 써봤는데
라는 아주 긴 오류가 떴다.
번역을 해보면 리스트를 배열로 변환하려고 할 때 나타나는 오류로 리스트의 타입(Integer)과 반환하려는 배열(int)의 타입이 일치하지 않아 발생하는 오류라고 한다.
기본 타입인 int[] 배열로 변환하려 할 때 자주 발생한다고 하는데, Java의 제네릭이 박싱 타입인 Integer와 같은 객체 타입만 지원하기 때문이다.
오류를 해결 하려면 리스트를 Integer 객체 배열로 변환한 다음, 이를 다시 int[] 배열로 반환하면 된다.
Integer[] tempArray = list.toArray(new Integer[list.size()]);
int[] intArray = new int[list.size()];
for(int i = 0; i < list.size(); i++){
intArray[i] = tempArray[i];
}
이렇게 Integer 타입의 배열로 만들고 값을 복사하여 int형 배열로 다시 담아줘서 return..
이게 첫 풀이(get)의 속도
이게 마지막(복사) 풀이의 속도인데
속도면에선 큰 차이가 없는 거 같아서 코드의 가독성을 생각했을 때 get으로 푸는 게 더 보기에 깔끔한 거 같다.
오늘은 toArray라는 메소드를 통해 기본(원시) 타입과 참조 타입에 대해 공부할 수 있어서 좋았다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] Lv1 제일 작은 수 제거하기 - Java (0) | 2024.03.18 |
---|---|
[프로그래머스] Lv1 핸드폰 번호 가리기 - Java (1) | 2024.03.17 |
[프로그래머스] Lv1 없는 숫자 더하기 - Java (2) | 2024.03.15 |
[프로그래머스] Lv1 콜라츠 추측 - Java (1) | 2024.03.15 |
[프로그래머스] Lv1 두 정수 사이의 합 - Java (0) | 2024.03.13 |