출처 - https://school.programmers.co.kr/learn/courses/30/lessons/136798
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
나의 풀이(오답)
function solution(number, limit, power) {
var answer = 0;
var yarr = [];
//number의 약수의 개수를 구해 배열에 push
for (let i = 1; i <= number; i++){
//각 약수를 세어 count 에 저장한 후 count를 push 하면 각 요소의 약수를
//따로 배열에 담을 수 있음
let count = 0;
//이중반복문을 이용해 각 요소마다의 약수를 구함
for(let j = 1 ; j <= i; j++){
if( i % j === 0){
count++;
}
}
yarr.push(count);
}
// 반복하며 yarr[i]가 limit을 넘는지 확인
for(let i = 0; i <yarr.length; i ++){
if(yarr[i] <= limit){
//limit을 넘지 않는다면 reduce를 이용해 요소를 전부 합친 값을 answer 에 할당
answer = yarr.reduce((a,b)=> a+b);
}else if( yarr[i] > limit )
//limit을 넘는다면 map을 이용해 a 가 limit을 넘는 요소를 찾아 a를 power로 바꾸고
//합친값을 answer에 할당
answer = yarr.map(a => a > limit ? a = power : a ).reduce((a,b) => a+b);
}
return answer;
}
이중반복문을 사용하여 시간초과가 많이 되었다.
다른사람의 풀이
function solution(number, limit, power) {
let answer = 0;
for (let i = 1; i <= number; i++) {
let divisor = 0;
//Math.sqrt => 루트값을 반환한다.
for (let j = 1; j <= Math.sqrt(i); j++) {
if (i % j === 0) {
if (i / j === j) divisor += 1;
else divisor += 2;
}
if (divisor > limit) {
divisor = power;
break;
}
}
answer += divisor;
}
return answer;
}
Math.sqrt를 사용하여 루트값을 구하여 식을 더 간결하게 표현했다. if문도 깔끔하게 한 반복문 안에서 다 수행할 수있도록 하여 걸리는 시간이 확 줄어들었다. 반복문을 줄일 방안을 계속 생각하며 풀어야겠다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 Lv.2 - 가장 큰 수(JS) (0) | 2024.04.04 |
---|---|
[알고리즘]프로그래머스Lv.1 - 완주하지 못한 선수 (JS) (0) | 2024.04.03 |
[알고리즘] 프로그래머스 Lv.1 - 두개 뽑아서 더하기 (0) | 2024.03.30 |
[알고리즘] 프로그래머스 Lv.1 - 추억 점수 (0) | 2024.03.26 |
[알고리즘] 프로그래머스 Lv.1 - 신고 결과 받기 (0) | 2024.03.24 |