728x90
https://school.programmers.co.kr/learn/courses/30/lessons/77884
문제
두 자연수 left와 right 사이의 수들 중 약수의 개수가 짝수인 수는 더하고 홀수인 수는 뺀다.
약수란 나머지가 0이 되게 딱 나눠떨어지는 수다.(ex:14의 약수는 1,2,7,14)
이 약수를 코딩에서 어떻게 구현해야 할지를 먼저 생각했다.
제일 먼저 생각난 것은 for문돌리고 나누고 난 나머지 구하는 연산인 '%' 를사용하는 것이다.
그리고 구한 약수들의 배열 중에서 길이가 짝수인 것은 +, 홀수인 것은 -로 바꿔주면 좋겠다고 생각했다.
제한사항
내가 코딩한 부분에서 신경써야 할 부분은 없었다.
답
function solution(left, right) {
let num = [];
let answer = [];
for(let i=left;i<=right;i++) { //left, right 사이의 수들을 모두 넣음
num.push(i);
}
num.filter(x => { //num에 넣은 수의 약수를 cal배열에 넣음
let cal = [];
for(let j=1;j<=x;j++) {
if(x%j == 0) {
cal.push(j);
}
}
if(cal.length%2 != 0) answer.push(-x); //cal배열에서 길이가 홀수면 -, 짝수면 플러스로 num의 숫자를 바꿔준 뒤 answer 배열에 넣음
else answer.push(x);
});
return answer.reduce((a,b) => a+b); //answer배열의 각 수를 더해준 값을 return 시킴.
}
만들어놓고 보니 배열의 개수가 좀 많아져서 지저분하다는 느낌도 드는 코드다.
filter와 reduce함수를 사용했다.
비교
굳이 여러개의 배열을 만들 필요 없이 두번의 for문을 돌려서 약수인 친구들을 더하거나 빼주면 더 가독성이 뛰어나다는 것을 알았다.
for (let i = left; i <= right; i++) {
let count = 0;
for (let j = 1; j <= i; j++) {
if (i % j === 0) count++;
}
if (count % 2) answer -= i;
else answer += i;
}
for문의 첫번째는 left, right 사이의 수를, 두번째는 1부터 i의 수까지를 범위로 설정하고 나누어 떨어지는 수(약수)의 수만큼 count를 더해준다.
그리고 약수의 총 개수가 홀수인지 짝수인지만 구해주면 된다.
나는 근데 최대한 js의 배운 함수를 써먹어보자는 취지로 쓴 코딩이기 때문에 filter나 reduce 사용법 다시 한번 체크해 두고 가면 좋고, 깔끔한 코딩 방법도 체크해 가면 좋겠다.
728x90
'JAVASCRIPT > 코딩테스트' 카테고리의 다른 글
[자바스크립트]프로그래머스 레벨1 - 음양 더하기 (0) | 2023.02.19 |
---|---|
프로그래머스 레벨1 - 로또의 최고 순위와 최저 순위(자바) (2) | 2023.02.15 |
프로그래머스 레벨1 - 부족한 금액 계산하기(자바스크립트) (4) | 2023.02.11 |
프로그래머스 레벨1 - 없는 숫자 더하기(자바스크립트) (3) | 2023.02.10 |
프로그래머스 레벨1 - 나머지가 1이 되는 수 찾기(자바스크립트) (3) | 2023.02.10 |
댓글