[프로그래머스] 기사단원의 무기

2022. 12. 22. 19:00기록/Programmers

    목차

문제 링크

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

 

프로그래머스

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

programmers.co.kr


나의 문제 풀이

function solution(number, limit, power) {
  let answer = 0;
  const countArr = [];

  for (let num = 1; num <= number; num++) {
    let count = 0;

    for (let i = 1; i <= Math.sqrt(num); i++) {
      if (num % i === 0) {
        if (num / i === i) {
          count += 1;
        } else {
          count += 2;
        }
      }
    }
    countArr.push(count > limit ? power : count);
  }
  answer = countArr.reduce((acc, cur) => acc + cur, 0);
  return answer;
}
  • 1부터 주어진 숫자까지 반복
    • 1부터 i의 제곱근까지 반복하면서 약수인지 판별함 (중복 카운트 방지)
    • num을 i로 나눈 나머지가 0일 경우 i는 num의 약수임
      • 나머지와 몫이 같을 경우 i만 num의 약수임
        • 예) 16 / 4 === 4
        • 약수 갯수 변수에 +1
      • 나머지와 몫이 다를 경우 i와 나머지는 num의 약수임
        • 예) 16 / 2 !== 2
        • 16 / 2 === 8
        • 약수 갯수 변수에 +2 (약수 2, 8)
  • 약수 갯수가 limit 보다 클 경우
    • 카운트 배열에 power 를 넣음
    • 아닐 경우 카운트 배열에 약수 갯수를 넣음
  • 카운트 배열의 요소들을 누적하여 정답 변수에 할당하고 리턴함

다른 사람의 문제 풀이

function solution(number, limit, power) {
    var answer = 0;
    for (let n = 1; n <= number; n++) {
        let count = 0;
        for (let j = 1; j * j <= n; j++) {
            if (j * j == n) count++;
            else if (n % j == 0) count += 2;
        }
        if (count > limit) count = power;
        answer += count;
    }
    return answer;
}