본문 바로가기
알고리즘

[프로그래머스][JS] Lv.1 약수의 개수와 덧셈

by codnjs779 2022. 11. 3.

약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

 
제한사항
  • 1 ≤ left  right ≤ 1,000
입출력 예
13 17 43
24 27 52

 

 

 

풀이 과정

1. left ~ right 해당하는 범위의 숫자 배열 구하기

2. 범위 내에서 제곱수가 아닌 수만 더하기 ( 제곱수가 아니라는 건 약수의 개수가 짝수인 거랑 같은 의미)

이대로 생각하고 코드를 처음 작성했을 때는 아래와 같은 방법으로 작성했다.

 

function solution(left, right) {
    const newArr = Array.from({length: right - left + 1 },(v,k)=> k + left )
    const newArrSum = newArr.reduce((a,b) => a + b)
    const cal = newArr.map((i) => Math.sqrt(i)).filter((i) =>  Number.isInteger(newArr[i])).map((i) => i ** 2).reduce((a,b) => a+b)
    return newArrSum - cal
}

,,,,ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

이렇게 했더니 런타임 error가 발생했다. 

지금 저걸 다시 보니까 제곱근을 구했다가 다시 제곱 계산을 하고 난리도 아닌 거 같다. 

 

 

 

그래서 다시 수정한 코드가

 

function solution(left, right) {
 const newArr = Array.from({length: right - left + 1 },(v,k)=> k + left )
    const test = newArr.map((i) => Math.sqrt(i)).filter((j) => (j % 1)  === 0 ).map((i) =>  i ** 2)
    const sumTest = test.reduce((a,b) => a +b)
    const intersection = newArr.filter((x) => !test.includes(x)).reduce((a,b) => a + b ) - sumTest
   return (intersection)
}

위와 같은 코드인데 사실 이것도 처음 쓴 코드랑 크게 다르지 않다.

한 변수에 몰았던 함수 연산들을 분산시킨 것 밖에 없다.

좀 변경된 건 합을 구할 때 차집합 연산 함수를 사용해본 거 정도?

 

 

제출을 해서 런타임 에러 없이 통과는 됐는데 원하는 코드 느낌은 저게 아니었다.ㅠㅠ

더 간단하고, 변수를 계속 만들기보단 주어진 조건을 최대한 활용해보고 싶었다.

그리고 제곱수는 약수의 개수가 홀수이다 를 잘 활용하면 훨씬 간단해질 거 같은데

맘처럼 생각이 안 돌아가서 간단한 답 앞에서 빙글빙글 돌고 있다는 생각이 계속 들었다. 😥

 

 

답을 확인하고 다른 사람 코드를 보니까 아,, 왜 이 생각을 못했지? 하는 생각이 들었다.

조건으로 left, right 숫자를 주니까 해당 값으로 반복문 범위를 정해준 다음, 제곱근을 계산해주고, 이 값을 정수 판별 함수를 통해서 다시 정수로 만들어서 연산해주면 된다. 

 

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

참,, 6시 반부터 9시 반까지 2시간 동안 빙빙 돌아온 거 같아서 답답했다,, 🤮😩

열심히 알고리즘 문제 연습하다 보면 명료한 코드를 짧은 시간에 생각하고 작성할 수 있겠지,,ㅠㅠ 🙏🙏🙏