본문 바로가기

프로그래머스/lv1

기사단원의 무기

/* 기사단원의 무기
 * 숫자나라 기사단의 각 기사에게는 1번부터 number까지 번호가 지정되어 있습니다.
 * 기사들은 무기점에서 무기를 구매하려고 합니다.
 * 각 기사는 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하려 합니다.
 * 단, 이웃나라와의 협약에 의해 공격력의 제한수치를 정하고,
 * 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는
 * 협약기관에서 정한 공격력을 가지는 무기를 구매해야 합니다.
 *
 * 예를 들어, 15번으로 지정된 기사단원은 15의 약수가 1, 3, 5, 15로 4개 이므로,
 * 공격력이 4인 무기를 구매합니다.
 * 만약, 이웃나라와의 협약으로 정해진 공격력의 제한수치가 3이고
 * 제한수치를 초과한 기사가 사용할 무기의 공격력이 2라면,
 * 15번으로 지정된 기사단원은 무기점에서 공격력이 2인 무기를 구매합니다.
 * 무기를 만들 때, 무기의 공격력 1당 1kg의 철이 필요합니다.
 * 그래서 무기점에서 무기를 모두 만들기 위해 필요한 철의 무게를 미리 계산하려 합니다.
 *
 * 기사단원의 수를 나타내는 정수 number와
 * 이웃나라와 협약으로 정해진 공격력의 제한수치를 나타내는 정수 limit와
 * 제한수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수 power가 주어졌을 때,
 * 무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 return 하는 solution 함수를 완성하시오.
 *
 * number   limit   power   result
 * 5        3       2       10
 * 10       3       2       21
 *
 * 1부터 5까지의 약수의 개수는 순서대로 [1, 2, 2, 3, 2]개입니다.
 * 모두 공격력 제한 수치인 3을 넘지 않기 때문에 필요한 철의 무게는 해당 수들의 합인 10이 됩니다.
 * 따라서 10을 return 합니다.
 *
 * 1부터 10까지의 약수의 개수는 순서대로 [1, 2, 2, 3, 2, 4, 2, 4, 3, 4]개입니다.
 * 공격력의 제한수치가 3이기 때문에, 6, 8, 10번 기사는 공격력이 2인 무기를 구매합니다.
 * 따라서 해당 수들의 합인 21을 return 합니다.
*/
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class programmer_1_1 {
    static int number1 = 5static int limit1 = 3static int power1 = 2;
    static int number2 = 10static int limit2 = 3static int power2 = 2;
 
    //구글링(어렵다..)
    public int getNum(int n){
        int cnt = 0;
        for(int i=1; i*<= n; i++){
            if(n%i == 0){
                cnt++;
                if(i*< n) cnt ++;
            }
        }
        return cnt;
    }
    public int solution(int number, int limit, int power) {
        int answer = 0;
        
        for(int i = 1; i <= number; i++){
            int result = getNum(i);
            if(result > limit) answer += power;
            else    answer += result;
        }
/*      내가 짰는데 시간초과 에러 발생
        for(int i = 1; i <= number; i++){   //약수
            int cnt = 0;
            for(int k = 1; k <= i; k ++){
                if(i%k == 0){
                    if(cnt > limit) break;
                    cnt++;
                }
            }
            if(cnt > limit)    answer += power;
            else               answer += cnt;
        }
*/
        return answer;
    }
 
    public int getTst(int n){
        int rst = 0;
        for(int i = 1; i <= n; i++){
            if(n%i == 0) rst++;
        }
        return rst;
    }
    
    public static void main(String args[]){
        programmer_1_1 t = new programmer_1_1();
        System.out.println("---------------------------------------");
        System.out.println("result = " + t.solution(number1, limit1, power1));
        System.out.println("---------------------------------------");
        System.out.println("result2 = " + t.solution(number2, limit2, power2));
        System.out.println("---------------------------------------");
    }
}
cs

'프로그래머스 > lv1' 카테고리의 다른 글

짝수와 홀수  (0) 2022.12.08
옹알이 (2)  (0) 2022.12.07
문자열 나누기  (0) 2022.12.07
푸드 파이트 대회  (0) 2022.12.07
과일 장수  (0) 2022.12.07