-
#AIL_23.11.29 // Programmers_나누어 떨어지는 숫자 배열AIL( Algorithm I Learned) 2023. 11. 29. 10:22
## AIL_나누어 떨어지는 숫자 배열
***문제 설명
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]
***입출력 예 설명
입출력 예#1_arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
입출력 예#2_arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
입출력 예#3_3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.
## solution.JavaScript
1. 문제의 접근 방식
주어진 문제는 배열(`arr`)의 각 요소 중에서 `dicisor`로 나누어 떨어지는 값을 오름차순으로 정렬하여 반환하는 문제입니다. 또한, 나누어 떨어지는 요소가 하나도 없을 경우에는 배열에 -1을 담아 반환해야 합니다.
1) 배열의 순회하면서 각 요소를 `divisor`로 나누어 떨어지는지 확인합니다.
2) 나누어 떨어지는 경우 해당 요소를 새로운 배열 `answer`에 추가합니다.
3) 나누어 떨어지는 요소가 없는 경우, `-1`을 `answer` 배열에 추가합니다.
4) 마지막으로, `answer` 배열을 오름차순으로 정렬합니다.
2. 문제풀이
function solution(arr, divisor) { var answer = []; // 나누어 떨어지는 요소를 저장할 배열 초기화 // 배열 순회 for (let i = 0; i < arr.length; i++) { if (arr[i] % divisor === 0) { // 현재 요소가 divisor로 나누어 떨어지는지 확인 answer.push(arr[i]); // 나누어 떨어지는 경우 answer 배열에 추가 } } if (answer.length === 0) { // 나누어 떨어지는 요소가 없는 경우 answer.push(-1); // -1 추가 } else { // 나누어 떨어지는 요소가 있는 경우 answer.sort((a, b) => a - b); // 오름차순으로 정렬 } return answer; // 결과 반환 } /* 테스트 1 입력값 〉 [5, 9, 7, 10], 5 기댓값 〉 [5, 10] 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 [2, 36, 1, 3], 1 기댓값 〉 [1, 2, 3, 36] 실행 결과 〉 테스트를 통과하였습니다. 테스트 3 입력값 〉 [3, 2, 6], 10 기댓값 〉 [-1] 실행 결과 〉 테스트를 통과하였습니다. */
1. `solution` 함수는 arr과 divisor를 매개변수로 받습니다.
2. `answer` 배열은 나누어 떨어지는 요소를 저장하기 위한 빈 배열로 초기화됩니다.
3. `for` 루프를 통해 배열 `arr`을 순회합니다.
4. 각 요소를 divisor로 나눈 나머지가 0인지 확인하여 나누어 떨어지는지 검사합니다.
5. 만약 현재 요소가 divisor로 나누어 떨어진다면, 해당 요소를 answer 배열에 추가합니다.
6. for 루프를 마치고 나서, answer 배열의 길이를 확인하여 나누어 떨어지는 요소가 하나도 없다면 -1을 추가합니다.
7. 나누어 떨어지는 요소가 있는 경우, answer 배열을 오름차순으로 정렬합니다.
8. 최종적으로 정리된 answer 배열을 반환합니다.
3. 다른사람의 문제풀이 및 접근방식 분석
function solution(arr, divisor) { // 주어진 배열(arr)을 순회하며 divisor로 나누어 떨어지는 요소만을 필터링하여 새 배열을 생성합니다. var answer = arr.filter(v => v % divisor == 0); // 필터링된 배열의 길이를 확인하여 처리합니다. // 만약 필터링된 배열의 길이가 0인 경우, 나누어 떨어지는 요소가 없는 경우이므로 -1이 담긴 배열을 반환합니다. // 그렇지 않은 경우, 필터링된 배열을 오름차순으로 정렬한 후 반환합니다. return answer.length == 0 ? [-1] : answer.sort((a, b) => a - b); } /* 테스트 1 입력값 〉 [5, 9, 7, 10], 5 기댓값 〉 [5, 10] 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 [2, 36, 1, 3], 1 기댓값 〉 [1, 2, 3, 36] 실행 결과 〉 테스트를 통과하였습니다. 테스트 3 입력값 〉 [3, 2, 6], 10 기댓값 〉 [-1] 실행 결과 〉 테스트를 통과하였습니다. */
1. ` arr.filter(v => v % divisor == 0);` 주어진 배열(arr)을 순회하며, divisor로 나누어 떨어지는 요소만을 새 배열로 필터링하고, 조건을 만족하는 요소들로 이루어진 새로운 배열을 answer 변수에 할당합니다.
var answer = arr.filter(v => v % divisor == 0);
- arr 배열을 순회하면서 각 요소 v에 대해 화살표 함수(v => v % divisor == 0)를 실행합니다.
- 화살표 함수의 조건은 v % divisor == 0입니다. 이는 배열의 각 요소 v를 divisor로 나누었을 때, 나머지가 0인지를 확인하는 조건입니다.
- 조건을 만족하는 요소들로 이루어진 새 배열이 answer 변수에 할당됩니다
2. ` return answer.length == 0 ? [-1] : answer.sort((a, b) => a - b);`
`answer `배열의 길이를 확인하여 처리하며, answer.length == 0인 경우: 나누어 떨어지는 요소가 없는 경우이므로, -1이 담긴 배열을 반환합니다. 그렇지 않은 경우: answer 배열을 오름차순으로 정렬하고 반환합니다.
# 성능으로 따져본다면 두 번째 방법이 좋은 방법입니다.
# filter() 메소드란?
filter() 메소드는 주어진 배열에서 조건에 맞는 요소들로 이루어진 새로운 배열을 반환합니다. 이 메소드는 배열의 각 요소를 순회하며 특정 조건을 만족하는 요소만을 포함하는 새로운 배열을 생성합니다.
# filter() 메소드의 기본 구조
const newArray = array.filter(callback(element, index, array) { // 조건을 검사하여 참인 경우만 반환될 새로운 배열에 추가 });
- callback: 각 요소에 대해 실행되는 함수로, 배열의 각 요소를 첫 번째 파라미터로 받습니다.
- element: 현재 처리 중인 요소입니다.
- index (옵션): 처리 중인 요소의 인덱스입니다.
- array (옵션): filter()를 호출한 배열 자체입니다.
filter() 메소드는 배열의 각 요소에 대해 callback 함수를 호출하고, callback 함수의 반환값이 true인 경우 해당 요소를 새로운 배열에 추가하여 최종적으로 필터링된 배열을 반환합니다. 반환된 배열은 주어진 조건을 만족하는 요소들로만 이루어져 있습니다.
# filter() 메소드 예시
const numbers = [1, 2, 3, 4, 5]; // 숫자가 짝수인 요소만을 필터링하여 새로운 배열을 생성합니다. const evenNumbers = numbers.filter(num => num % 2 === 0); console.log(evenNumbers); // 출력: [2, 4]
numbers 배열에서 filter()를 사용하여 숫자가 짝수인 요소들만을 필터링하여 evenNumbers라는 새로운 배열을 생성했습니다. 이때 callback 함수에서는 각 요소를 받아 해당 요소가 짝수인지를 확인하고, 짝수인 경우에만 true를 반환하여 그 요소를 새로운 배열에 추가하게 됩니다.
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_23.12.01 // Programmers_없는 숫자 더하기 (0) 2023.12.01 #AIL_23.11.30 // Programmers_음양 더하기 (0) 2023.11.30 #AIL_23.11.28 // Programmers_콜라츠 추측 (1) 2023.11.28 #AIL_23.11.27 // Programmers_두 정수 사이의 합 (1) 2023.11.27 #AIL_23.11.24 // Programmers_하샤드 수 (1) 2023.11.24