감 잃지말고 개발하기

[프로그래머스] [JAVA] [Level 1] [약수 구하기] 기사단원의 무기 본문

프로그래머스/JAVA

[프로그래머스] [JAVA] [Level 1] [약수 구하기] 기사단원의 무기

persii 2022. 12. 28. 15:25

문제

1번부터 number까지 번호가 지정되어 있는 각 기사들이 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하고자 한다.

단, 이웃나라와의 협약에 의해 공격력의 제한수치가 정해져 있는데, 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매해야 한다.

예를 들어, 15번으로 지정된 기사단원은 15의 약수가 1, 3, 5, 15로 4개 이므로, 공격력이 4인 무기를 구매해야 한다.

이때, 이웃나라와의 협약으로 공격력의 제한수치가 3으로 정해졌고, 제한수치를 초과한 기사가 사용할 무기의 공격력은 2로 정해졌다.

때문에 15번으로 지정된 기사단원은 공격력이 2인 무기를 구매해야 한다.

 

무기점에서 무기를 만들기 위해 공격력 1당 1kg의 철이 필요하다고 한다.

 

기사단원의 수를 나타내는 정수 number와 

이웃나라와 협약으로 정해진 공격력의 제한수치를 나타내는 정수 limit와 

제한수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수 power가 주어졌을 때, 

무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 계산하는 함수를 완성하시오.

 


 

접근방법

1. 기사 번호마다 접근하기 위해 for문 사용

    

2. 약수를 구하기 위해 java.lang.Math 클래스의 sqrt() 메서드 사용

 

 

해결

import java.util.ArrayList;

class Solution {
    public int solution(int number, int limit, int power) {
        
        int sum = 0;
        int steel = 1;  // 무기 공격력 1당 필요한 철 무게
        
        // 1. 기사 번호마다 접근
        for(int i=1; i<=number; i++) {
            
            // 2. 번호마다 약수 개수 구하기
            int count = 0;	// 번호마다 약수 개수를 저장할 변수 
            int sqrt = (int) Math.sqrt(i);  // i의 제곱근 
            
            for(int j=1; j<=sqrt; j++){
                if(i % j == 0){ // 떨어질 때 == 약수일 때
                    count ++;
                }
            }
            
            // 기사번호가 제곱수인 경우에 대한 약수 개수 처리
            if ((int)(Math.pow(sqrt, 2)) == i) {
                count = (count*2)-1;
            } else {
                count = count*2;
            }
            
            // 3. 약수 개수에 따라 각 기사번호마다 공격력 구분
            if (count > limit) {
                sum += power;
            } else {
                sum += count;
            }
        }
        
        // 4. 총 필요한 철의 무게 리턴
        return sum * steel; 
    }
}

 

 


 

 추가 설명 

1.  java.lang.Math 클래스의 sqrt() 메소드

제곱근(root)을 구할 때 사용하는 메서드로 double형으로 리턴된다.

  • 인자로 a를 전달하면 a의 제곱근이 리턴
  • 인자로 0을 전달하면 0이 리턴
  • 인자로 음수나 NaN(Not a Number)를 전달하면 NaN이 리턴

 

2.  java.lang.Math 클래스의 pow() 메소드

특정값의 제곱을 구할 때 사용하는 메서드로 입력값과 출력값은 모두 double형이다.

  • Math.pow(대상숫자, 지수)