문제 & 제한사항
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수 작성
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] |
풀이 방법
- 우선 주어진 배열을 순회 하면서 divisor로 나누어 떨어지는 값을 새 배열(answer)에 추가해야 한다고 생각했다.
- 내가 만든 배열인 answer의 길이가 1이상 인 것은 값이 들어왔다는 것이니 sort()로 오름차순 정렬 후 반환하도록 한다.
- 만약 없으면 배열에 -1을 추가한 후 반환하도록 작성했다.
코드
function solution(arr, divisor) {
var answer = [];
for (i = 0; i < arr.length; i++) {
if (arr[i] % divisor === 0) {
answer.push(arr[i]);
}
}
if (answer.length >= 1) {
return answer.sort((a, b) => a - b);
} else {
answer.push(-1);
return answer;
}
}
console.log(solution([5, 9, 7, 10], 5)); // [5, 10]
console.log(solution([2, 36, 1, 3], 1)); // [1, 2, 3, 36]
console.log(solution([3, 2, 6], 10)); // [-1]
새롭게 알게 된 점
JavaScript에서 숫자 배열을 오름차순으로 정렬하기 위해서는 (a, b) => a - b
를 해줘야 한다는 것이다.
처음에 sort()
만 적고 채점 했을 때 결과 값에 [5, 10]이 아닌 [10, 5]로 나와서 왜 그런지 찾아봤었다.
sort()
는 정렬하기 전 배열 내의 값을 내부적으로 문자열로 변환하기 때문에 결과 값이 [10, 5]로 나왔던 것이다.
문자열로 대소비교가 되었다는 것과 숫자처럼 자리수가 중요하지 않다는 것을 알게 되었다.
숫자 배열 정렬하기 위해서는 2개의 인자 값이 필요하며, 다음과 같은 규칙을 따라야 한다.
첫 번째 인자가 두 번째 인자보다 작으면 음수를 반환
첫 번째 인자가 두 번째 인자보다 크면 양수를 반환
첫 번째 인자가 두 번째 인자와 같으면
0
을 반환
오름차순을 하기 위해서는 “첫 번째 인자 - 두 번째 인자”를 해야 한다.
내림차순을 하기 위해서는 “두 번째 인자 - 첫 번째 인자”를 해주면 된다.
// 오름차순
arr.sort((a, b) => a - b);
// 내림차순
arr.sort((a, b) => b - a);
다른 사람 풀이 & 느낀 점
function solution(arr, divisor) {
var answer = arr.filter((v) => v % divisor == 0);
return answer.length == 0 ? [-1] : answer.sort((a, b) => a - b);
}
filter
로 배열을 순회 하면서 필터링하는 방법이다.
위 코드를 보고 아직 내가 알고리즘을 풀 때 함수 사용에 익숙하지 않다는 점을 알게 되었다.
또, 삼항 연산자를 통해 보기 쉽게 작성할 수 있다는 걸 다시 깨닫게 되었다.
아직 Python으로 작성하던 습관이 남아 있어 if
문을 그대로 작성했는데, 다음엔 변수에 바로 할당할 수 있는 삼항 연산자로 구현해봐야겠다.
또 다른 차이점은 다른 사람의 코드와 내 코드를 채점 했을 때 속도 차이가 있다는 것이다.
내가 풀었던 코드로 테스트케이스를 채점 했을 때 한 문제당 평균 3ms 정도라면 위 코드에서는 평균 0.1ms 정도였다.
GPT에 왜 속도 차이가 나는 건지 물어봤을 때, 2개의 차이점을 설명해줬다.
filter
함수 vsfor
루프 사용- 조건부 반환 위치
filter
를 통해 빠른 속도로 필터링 할 수 있지만 내 코드는 루프를 돌면서 요소를 확인하고 배열에 추가하기 때문에 느리다는 것을 알 수 있었다!