본문 바로가기
코딩테스트

프로그래머스 자바스크립트 약수의 개수와 덧셈

by min' 2023. 4. 16.
728x90
반응형

 

 

- 문제 설명

 

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

 

개인적으로 왜 1점 밖에 안 주지?하고 생각했던 문제였다.

생각보다 문제 푸는 방식이 복잡했다 ㅠㅠㅠ(이리저리 꼬여 있었던...)

도저히 어떻게 더 쉽게 풀 수 있을지 생각이 나지 않았다.

 

나는 조건에 맞게 각각 배열에 담아주는 방식을 사용하였다.

 

먼저, for문을 돌려 left부터 right까지의 숫자들을 arr 변수에 배열로 담아주었다.

그 다음은, for문 내에 중접for문을 하나 더 생성하여 i 를 j로 나눈 나머지가 0일때(약수) 변수 divis에 i를 push해주었다.

=> 여기서 왜 i로 넣어줬냐? 우리는 약수의 갯수를 구해야 하는 것이지 약수가 무엇무엇이 있는지 구해야 하는 것은 아님.

그런데 이렇게 되면 divis 배열 내에는 여러 수의 약수가 다 들어가기 때문에 각각의 약수의 갯수를 구하기가 힘들어짐.

그렇기 때문에 [ 13, 13, 13, 14, 14 ] 이런식으로 약수들을 넣은 후에 약수의 갯수를 구하도록 할 거임.

 

그 다음에는 for문 내에서 divis로 filter를 돌려(i를 필요로 함) num(배열의 각 수)과 i가 같을 때

=> 위에서 말한 대로 현재 수가 13이면 약수값 대신 넣어준 13의 갯수로 약수의 갯수를 구하는 것.

수에 해당하는 약수의 갯수를 구하여 변수 divisLength의 배열에 각각 담아줌.

 

for (let i = left; i <= right; i++) {
  arr.push(i);
  for (let j = 1; j <= i; j++) {
    if(i % j === 0) {
      divis.push(i);
    }
  }
  divisLength.push(divis.filter((num)=> num === i).length);
}

 

divisLength의 갯수를 구했다면 

아래에 for문을 하나 더 만들어 divisLength를 이용하여 for문을 돌릴 것이다.

for문 내에 if문을 이용하여 divisLength[x] % 2 === 0(짝수일 때)일때 미리 만들어준 변수 answer에 arr[x]를 더할 것이고

divisLength[x] % 2 === 1(홀수일 때)일때 answer에 arr[x]를 빼줄 것이다.

 

arr에서도 x를 index 값으로 사용할 수 있는 이유는 결국 한 수당 약수를 무조건 하나씩은 가지기 때문에arr.length와 divisLength.length의 수가 같기 때문이다.

 

이렇게 해준 다음 answer를 return하면 끝.

 

for ( let x = 0; x < divisLength.length; x++) {
  if(divisLength[x] % 2 === 0) {
    answer += arr[x];
  } else if(divisLength[x] % 2 === 1) {
    answer -= arr[x];
  }
}
return answer;

 

[ 전체 코드 ]

 

function solution(left, right) {
  let arr = [];
  let divis = [];
  let divisLength = [];
  let answer = 0;

  for (let i = left; i <= right; i++) {
    arr.push(i);

  for (let j = 1; j <= i; j++) {
    if(i % j === 0) {
      divis.push(i);
    }
  }

  divisLength.push(divis.filter((num)=> num === i).length);
}

  for ( let x = 0; x < divisLength.length; x++) {
    if(divisLength[x] % 2 === 0) {
      answer += arr[x];
    } else if(divisLength[x] % 2 === 1) {
      answer -= arr[x];
    }
  }
  return answer;
}
728x90
반응형

댓글