반응형
프로그래머스 LV1 > 연습문제 > 기사단원의 무기
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/136798
[문제해결]
1. 약수는 n으로 나눈 나머지가 0인것으로 판단한다.
2. 약수의 갯수는 약수들을 배열에 넣고 배열의 길이로 계산했다.
3. 리밋에 걸리면 power을 더해주고, 안걸리면 그대로 더해준다.
** 타임아웃에 주의하며 약수구하는 시간을 어떻게든 줄여본다.
일단 의식의 흐름대로 작성했고.
function solution(number, limit, power) {
const divisors = []; // 약수의 갯수 순서
for(let i=1; i <= number; i++){
let temp = [];
for(let j=1; j<=i; j++){
if(i % j === 0) temp.push(j);
}
divisors.push(temp.length)
}
const answer = divisors.reduce((acc, res)=>{
res > limit ? acc+=power : acc+=res
return acc
})
return answer
// return answer;
}
이중포문 도는데 왠지 타임아웃 날것같았는데 역시나 시간초과..
약수 구하는공식에 /2를 해줘서 반으로 줄여보자
function solution(number, limit, power) {
const divisors = []; // 약수의 갯수 순서
const getDivisors = (num) => { // 약수구하는 공식을 수정했다
const tempDivisors = [];
for(let i = 1 ; i <= num/2 ; i++){
if(num % i === 0) tempDivisors.push(i);
}
return [...tempDivisors, num];
}
for(let i=1; i<=number; i++){ //약수의 갯수만큼 푸시
divisors.push(getDivisors(i).length);
}
const answer = divisors.reduce((acc, res)=>{
res > limit ? acc+=power : acc+=res
return acc
})
return answer
// return answer;
}
통과는 했지만 역시나 시간이 꽤 걸리는것같다. 약수구하는 문제가 꽤 많이 등장하는데, 모든 배열을 판단하는것보다 sqrt를 쓴다든지, 나누기 2를 한다든지, 하는 방법을 익혀두면 도움이 될것같긴 하다.
반응형
'[IT] 프로덕트 개발 > Coding Test - 코딩테스트' 카테고리의 다른 글
[LV1] 체육복 (0) | 2022.11.23 |
---|---|
[LV1] 문자열 내 마음대로 정렬하기 (0) | 2022.11.21 |
[LV1] 옹알이2 / while() (0) | 2022.11.15 |
[LV1] 콜라 문제 / 수학적 계산이 전부인 while() (0) | 2022.11.15 |
[LV1] 삼총사 / 3중 for문 (0) | 2022.11.13 |