Dev/Algorithm

[프로그래머스] 기사단원의 무기 - Java

VIPeveloper 2024. 5. 23. 13:19
728x90
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/136798

 

생각

  • 생각을 하고, 구현하는 정도의 수준이 Lv1 이라면, 나는 그정도는 되는 것 같다는 생각이 들었다.
// 1. 기사들을 순회하면서
// 2. 약수의 갯수 배열 채우기
// 3. 배열을 채울 때 limit을 고려하여 초과한다면 power 로 대체하기
// 4. sum 구하기

// 약수 구하는 방법
// 1 ~ 15 순회
// 15 % var = 0 이면 cnt++

코드

public class Main {
    public static void main(String[] args) {
        System.out.println(solution(5,3,2)); // 2
        System.out.println(solution(10,3,2)); // 2
    }
    public static int solution(int number, int limit, int power) {
        int answer = 0;
        for (int i = 1; i <= number ; i++) {
            int yakSu = getYaksu(i);
            answer += yakSu>limit ? power : yakSu;
        }
        return answer;
    }

    private static int getYaksu(int gisaNum) {
        int cnt = 0;
        for (int i = 1; i <= Math.sqrt(gisaNum) ; i++) {
            if(i*i==gisaNum) cnt++;
            else if(gisaNum%i==0) cnt+=2;
        }
        return cnt;
    }
}

다른 사람 풀이

  • 약수 갯수를 미리 다 구해놓는 방법이 신기했다.
public class Main {
    public static void main(String[] args) {
        System.out.println(solution(5,3,2)); // 2
        System.out.println(solution(10,3,2)); // 2
    }
    public static int solution(int number, int limit, int power) {
        int[] count = new int[number + 1];
        for (int i = 1; i <= number; i++) {
            for (int j = 1; j <= number / i; j++) {
                count[i * j]++;
            }
        }
        int answer = 0;
        for (int i = 1; i <= number; i++) {
            if (count[i] > limit) {
                answer += power;
            } else {
                answer += count[i];
            }
        }
        return answer;
    }
}
728x90
반응형