JAVASCRIPT/코딩테스트

프로그래머스 레벨1 - 약수의 개수와 덧셈(자바스크립트)

진짠 2023. 2. 14. 23:34
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/77884

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

두 자연수 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