[프로그래머스] 나누어 떨어지는 숫자 배열
2021.12.29에 푼 문제입니다.
이번 문제는 쉬운 편이라서 바로 풀었습니다.~
해결방안
function solution(arr, divisor) {
let answer = arr.filter(x => x % divisor == 0);
return answer.length > 0 ? answer.sort((a, b) => a-b) : [-1];
}
해결방안 순서
- arr배열의 각 element 중 divisor로 나누어 떨어지는 값 구하기
- 오름차순으로 정렬한 배열을 반환, divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환
1단계. arr배열의 각 element 중 divisor로 나누어 떨어지는 값 구하기
// 1단계. arr배열의 각 element 중 divisor로 나누어 떨어지는 값 구하기
let answer = arr.filter(x => x % divisor == 0);
arr배열의 원소중 divisor로 나누어지는 값만 추출하기 위해 filter() 메서드를 사용해주었습니다.
MDN Web Docs
filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
구문 : arr.filter(callback(element[, index[, array]])[, thisArg])
- callback :각 요소를 시험할 함수. true를 반환하면 요소를 유지하고, false를 반환하면 버립니다. 다음 세 가지 매개변수를 받습니다.
- element : 처리할 현재 요소.
- index Optional : 처리할 현재 요소의 인덱스.
- array Optional : filter를 호출한 배열.
- thisArg Optional : callback을 실행할 때 this로 사용하는 값.
// filter() 메서드 예제
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result); // result = ["exuberant", "destruction", "present"]
테스트1로 설명 arr = [5, 9, 7, 10]; divisor = 5;
let answer = arr.filter(x => x % divisor == 0);
- x는 5, 9, 7, 10 순으로 진행
- x % divisor == 0 : 현재 arr배열의 원소가 divisor을 나누어 떨어지는지 나타냄
테스트 1. arr = [5, 9, 7, 10]; divisor = 5;
let answer = arr.filter(x => x % divisor == 0); -> x는 5, 9, 7, 10 순으로 진행
x = 5
arr.filter(5 => 5 % 5 == 0); -> true
answer =[5]
x = 9
arr.filter(9 => 9 % 5 == 0); -> false
answer =[5]
x = 7
arr.filter(7 => 7 % 5 == 0); -> false
answer =[5]
x = 10
arr.filter(10 => 10 % 5 == 0); -> true
answer =[5, 10]
테스트 2. arr = [2, 36, 1, 3]; divisor = 1;
let answer = arr.filter(x => x % divisor == 0); -> x는 2, 36, 1, 3 순으로 진행
x = 2
arr.filter(2 => 2 % 1 == 0); -> true
answer =[2]
x = 36
arr.filter(36 => 36 % 1 == 0); -> true
answer =[2, 36]
x = 1
arr.filter(1 => 1 % 1 == 0); -> true
answer =[2, 36, 1]
x = 3
arr.filter(3 => 3 % 1 == 0); -> true
answer =[2, 36, 1, 3]
테스트 3. arr = [3, 2, 6]; divisor = 10;
let answer = arr.filter(x => x % divisor == 0); -> x는 3, 2, 6 순으로 진행
x = 3
arr.filter(3 => 3 % 10 == 0); -> false
answer =[]
x = 2
arr.filter(2 => 2 % 10 == 0); -> false
answer =[]
x = 6
arr.filter(6 => 6 % 10 == 0); -> false
answer =[]
2단계. 오름차순으로 정렬한 배열을 반환, divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환
//2단계. 오름차순으로 정렬한 배열을 반환, divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환
return answer.length > 0 ? answer.sort((a, b) => a-b) : [-1];
1단계에서 구한 answer배열을 통해 오름차순으로 반환해주었고,
answer배열에 아무런 원소가 없다면 -1를 반환해주었습니다.
여기서 answer배열에 원소가 있냐 없냐에 따라 반환값이 달라져서 삼항 연산자를 사용했고,
answer배열에 원소가 있을경우 오름차순으로 정렬해야 돼서 sort()메서드를 사용해 주었습니다.
프로그래머스에서 삼항 연산자와 sort()메서드를 지겹게 쓰고 있는 것 같아요.😆
삼항 연산자
구문 : 조건 ? true : false
- 조건이 true이면 true를 실행
- 조건이 false이면 false를 실행
MDN Web Docs
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.
구문 : 배열.sort(정렬 순서를 정의하는 함수)
sort() 메서드는
- sort((a,b)=>a-b); -> 오름차순
- sort((a,b)=>b-a); -> 내림차순
sort()메서드를 쓸 때 compare함수의 형식으로 쓰는 법을 알고 싶다면
실패율 해결방법 링크를 보시면 됩니다.👇
https://development-piece.tistory.com/7
[프로그래머스] 실패율
2021.10.25에 푼 문제입니다. 이번에도 역시나... 잘 안 풀려서ㅠ 남친님한테 SOS해서 풀었습니다.😂 남친님이 치는 코드 보면 존경스러워요ㅠㅠ 너무 잘해요. 그냥 봐도 이해가 되고 자바스크립트
development-piece.tistory.com
- answer.length > 0 : (조건) answer배열길이가 0보다 클 경우
- answer.sort((a, b) => a-b) : (조건이 true일 경우) answer배열 오름차순으로 정렬하기
- [-1] : (조건이 false일 경우) answer배열을 [-1]로 바꾸기
return answer.length > 0 ? answer.sort((a, b) => a-b) : [-1];
테스트 1. arr = [5, 9, 7, 10]; divisor = 5;
answer =[5, 10]
answer.length > 0 -> 2 > 0 -> true -> answer.sort((a, b) => a-b)실행
answer =[5, 10]
테스트 2. arr = [2, 36, 1, 3]; divisor = 1;
answer =[2, 36, 1, 3]
answer.length > 0 -> 4 > 0 -> true -> answer.sort((a, b) => a-b)실행
answer =[1, 2, 3, 36]
테스트 3. arr = [3, 2, 6]; divisor = 10;
answer =[]
answer.length > 0 -> 4 > 0 -> false -> [-1]실행
answer =[-1]
여기까지 프로그래머스 나누어 떨어지는 숫자 배열 해결방안에 대해 설명해보았습니다.