class Solution {
public int[] solution(int[] arr, int divisor) {
int[] answer = {};
int count = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] % divisor == 0){
count++;
answer = new int[count];
}
}
if(count == 0){
answer = new int[1];
answer[0] = -1;
}
count = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] % divisor == 0){
answer[count] = arr[i];
count++;
}
}
int temp = 0;
for(int i = 0; i < answer.length - 1; i++) {
for(int j = i + 1; j < answer.length; j++) {
if(answer[i] > answer[j]) {
temp = answer[i];
answer[i] = answer[j];
answer[j] = temp;
}
}
}
return answer;
}
}
풀긴 했지만 정말 쓰레기 같은 코드라고 코딩하는 내내 생각했다....
return되는 배열의 갯수가 나누어 떨어지는 갯수와 같아야 하기 때문에 갯수 선언을 위해 for문을 한 번 돌렸다.
후에, 갯수를 위해 돌렸던 for문에 있던 count가 0이라면 나누어 떨어지는 수가 없는 것이기 때문에 -1로 고정을 했다.count를 다시 초기화 시키고 조건이 충족되어 count가 올라가면 그 배열 인덱스에 해당 arr값을 넣어준 후 정렬을 시켜 for문을 총 3번이나 돌리는 끔찍한 코드가 되어버렸다. (이중 for문까지 하면 4개...)
코드를 이런 식으로 짜면 정렬하는 과정에서 배열의 모든 요소를 반복하면서 최솟값을 찾아 앞쪽으로 옮기는 방식으로 동작하며, 시간 복잡도가 정말 꽝이다.
다른 사람들의 풀이를 보니 공부 욕구가 생기는 생각지도 못한 코드들이 많았다.
import java.util.Arrays;
class Solution {
public int[] solution(int[] arr, int divisor) {
int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
if(answer.length == 0) answer = new int[] {-1};
java.util.Arrays.sort(answer);
return answer;
}
}
이 코드는 코드 길이의 차이부터 해서 Arrays.stream(arr)을 사용하여 배열을 스트림으로 변환하고, filter() 메서드를 사용하여 주어진 조건에 해당하는 요소를 필터링한다.
훨씬 간결하고 가독성 좋은 코드라고 생각하며 오늘도 하나 배워간다.
출처: 프로그래머스 코딩 테스트 연습 https://programmers.co.kr/learn/challenges
'코딩테스트 > 프로그래머스 Lv1' 카테고리의 다른 글
문자열 내림차순으로 배치하기 (2) | 2024.04.03 |
---|---|
수박수박수박수박수 ~~~ (0) | 2024.04.03 |
두 정수 사이의 합 (2) | 2024.04.03 |
문자열 내 p와 y의 갯수 (0) | 2024.04.03 |
x만큼 간격이 있는 n개의 숫자 (0) | 2024.04.03 |