본문 바로가기

프로그래머스

[C언어/프로그래머스] 기사단원의 무기

728x90
 

프로그래머스

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

programmers.co.kr

 

[소스코드]

 

#include <stdio.h>


int solution(int number, int limit, int power) {
    int answer = 1;
    
    for(int i=2;i<=number;i++){
        int count=0;
        for(int j=1;j*j<i;j++){
            
            if(i%j==0)
            count+=2;          
           
            if((j+1)*(j+1)==i)
            count+=1;
              
            
        if(count>limit){                  
           answer+=power;
           break;}
        }
    
        if(count<=limit)
        answer+=count;
       
    }
   
    return answer;
}

[풀이]

약수를 구하는 문제에서 변형된 문제다.

값을 구하는건 쉬우나 시간 초과가 뜨는게 문제다.

반복문의 범위를 줄여줘야 하는데, 

예를 들어 10의 약수 1,2,5,10 이라면 1과 2로 나눈 값 5,10의 개수도 저장을 해준다. 이러면 시간은 대폭 줄일수있다. j*j<i로 잡아주면 되는데 주의할 점은 

1은 포함이 안되서 answer에 1을 더해주고 시작한다.

if((j+1)*(j+1)==i)는  9로 예를 들면 1,3,9 즉

3으로 나누면 약수의 개수는 1개기 때문에 조건문을 추가 했다.