Algorithm

[프로그래머스/JavaScript] Lv.3 억억단을 외우자

cob 2022. 12. 5. 17:55

 

 

해당 문제는 시간 복잡도 개선하는 수학적 사고가 필요한 문제이다.

 

 

 

프로그래머스

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

programmers.co.kr

 

 


1. 문제 설명

문제 설명

 

 


2. 입출력 예

입출력 예

 

 


3. 문제 풀이

function solution(e, starts) {
	// 1) e이하의 자연수이기 때문에 e만큼 배열 생성
    const numsArr = new Array(e+1).fill(0);

    /*
      2) 약수의 개수를 한번에 count하는 반복문
    	 인덱스 번호를 자연수로 정하고, 해당 자연수에 대한 약수를 
         반복문을 통해 하나씩 증가시킨다.
    */
    for(let i = 1;i<=e;i++) {
        for(let j = i;j<=e;j += i) {
            // 3) 해당 자연수(j)의 배수를 찾아 1씩 증가 하므로 약수의 개수를 하나씩 늘려간다.
            numsArr[j] += 1;
        }
    }
    
    // 4) 범위의 Max값을 담는 배열 생성
    const maxArr = new Array(e+1).fill(e);
   
    // 5) 범위별 Max값을 구하는 반복문
    for(let i=e-1; i>0; i--) {
    
        /* 
          6) maxArr에 담긴 값은 Max값의 자연수(인덱스) 이므로 
             numsArr에서 자연수의 약수 개수를 가져온다.
        */
        if(numsArr[i] >= numsArr[maxArr[i+1]]) {
        
            // 7) 약수의 개수가 크면 해당 자연수(인덱스)를 현재 maxArr에 담는다.
            maxArr[i] = i;

        } else {
            // 8) 약수의 개수가 작으면 앞으 자연수(index)를 현재 maxArr에 담는다.
            maxArr[i] = maxArr[i+1];
        }
    }
    
    // 9) 범위별 Max값이 구해져 있으므로 가져와 return 한다. 
    return starts.map(s => maxArr[s]);
}
  • 구구단에서 해당 자연수가 등장하는 횟수는 약수의 개수와 동일하다
  • 시간 초과가 걸리지 않기 위해 약수의 개수를 통으로 구해야 한다.
  • 마찬가지로 Max값도 구간별로 미리 구해놔야 한다.

 

반응형