본문 바로가기
코테연습

181. 기사 단원의 무기 Javascript

by hxunz 2023. 1. 25.

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

 

프로그래머스

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

programmers.co.kr

 

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
    무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 구하라
  • 주어진 자료는 무엇인가?
    number: 기사 단원의 수를 나타내는 정수
    limit: 공격력의 제한 수치를 나타내는 정수

    power: 제한 수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수
  • 조건은 무엇인가?
    이웃나라와의 협약에 의해 공격력의 제한수치를 정하고, 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매해야 합니다.
    1 ≤ number ≤ 100,000
    2 ≤ limit ≤ 100
    1 ≤ power  limit

2. 계획

  • 공격력 = 자신의 기사 번호의 약수 개수 
  • 철의 무게 = 공격력1당 1kg = 공격력kg
  • 1부터 number까지의 약수의 개수를 구한다.
  • 각 수가 power보다 높으면 power 값으로 대체한다.
  • 총 합계를 구한다.

3. 실행

const solution = (number, limit, power) => {
  let submultiple = getSubMultiple(number);

  const weight = submultiple.map((it) => {
    if (it <= limit) {
      return it
    } else {
      return power
    }
  })

  return weight.reduce((acc, cur) => acc + cur, 0);
};

const getSubMultiple = (number) => {
  let submultipleCount = [];

  while (number >= 0) {
    let submultiple = [];

    for (i = 1; i <= Math.sqrt(number); i++) {
      if (number % i === 0) {
        submultiple.push(i);
        if (number / i !== i) {
          submultiple.push(number / i)
        }
      }
    }
    submultipleCount.push(submultiple.length);
    number -= 1;
  }

  return submultipleCount;
}

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
    재귀로 풀어보았으나 일부 테스트 케이스에서는 시간초과가 난다.
    시간초과가나면 빅오 관점에서 개선할 방법을 생각해봐야겠다.
const solution = (number, limit, power) => {
  let submultiple = getSubMultiple(number);

  const weight = submultiple.map((it) => {
    if (it <= limit) {
      return it
    } else {
      return power
    }
  })

  return weight.reduce((acc, cur) => acc + cur, 0);
};

const getSubMultiple = (number, submultipleCount = []) => {
  let submultiple = [];

  if (number === 0) {
    return submultipleCount
  };

  for (i = 1; i <= Math.sqrt(number); i++) {
    if (number % i === 0) {
      submultiple.push(i);
      if (number / i !== i) {
        submultiple.push(number / i)
      }
    }
  }
  submultipleCount.push(submultiple.length)

  return getSubMultiple(number -= 1, submultipleCount);
};

 

댓글