알고리즘

[알고리즘]프로그래머스 Lv.1 - 기사단원의 무기

로돌씨 2024. 4. 1. 19:47

출처 - 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문도 깔끔하게 한 반복문 안에서 다 수행할 수있도록 하여 걸리는 시간이 확 줄어들었다. 반복문을 줄일 방안을 계속 생각하며 풀어야겠다.