[프로그래머스 lev2/JS] 숫자의 표현

woolee의 기록보관소·2022년 11월 8일
0

알고리즘 문제풀이

목록 보기
91/178

문제 출처

프로그래머스 lev2 - 숫자의 표현

나의 풀이

function solution(n) {
  let answer=0;
  for (let i=1; i<=n; i++) {
    // let tmp=[];
    let sum=i;
    let idx=i;
    // tmp.push(idx);
    while (sum<n) { 
      idx++;
      sum += idx; 
      // tmp.push(idx);
    }

    if (sum===n) {
      // console.log(tmp);
      answer++;
    }
  }
  return answer;
}

console.log(solution(20));

다른 풀이

약수이고, 홀수면 answer++;

홀수의 경우 약수는 홀수밖에 안 나온다.
예를 들어 15의 약수는 1, 3, 5, 15를 활용해서 연속된 수의 합이 15가 되도록 나올 수 있음.

15=1+2+3+4+5 (중간값 3) 3x5 / 15=4+5+6 (중간값 5) 5x3 / 15=7+8 (연속된 수) 7+8 - 홀수인 경우 무조건 가능. / 15=15 / 중간값이 3인 경우, 중간값이 5인 경우, 연속된 수(7, 8), 15(n) 해서 4개인데, 이게 공교롭게 홀수의 약수 수와 같음.

그리고 짝수의 경우는 홀수의 연장선이라고 보면 됨. n=30인 경우, 30의 약수는 1, 2, 3, 5, 6, 10, 15, 30임. 30=4 + 5 + 6 + 7 + 8 (중간값 3의 연장) 2x3x5 / 30=9 + 10 + 11 (중간값 5의 연장) 2x5x3 / 30=6+7+8+9 (연속된 두 수의 연장) 2x(7+8) / 30=30 /

결과적으로 n의 홀수 약수 개수만 구해도 답이랑 같음.

다시 잘 생각해보면,
결국 합해서 15가 된다는 건 곱해서도 15가 될 수 있다는 거니까..??

function expressions(num) {
    var answer = 0;

  for(var i=1; i<=num; i++) {
    if (num%i == 0 && i%2 == 1)
      answer++
  }
    return answer;
}
profile
https://medium.com/@wooleejaan

0개의 댓글