본문 바로가기
스터디/묘공단 자바 코딩테스트

[프로그래머스/Java] 9일차 코테 문풀 - Lv. 1 기사단원의 무기

by 빙수야 팥빙수야 2024. 4. 24.

🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

📝 문제 요약

각 기사는 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하려 합니다.

단, 이웃나라와의 협약에 의해 공격력의 제한수치를 정하고,

제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매합니다.

입출력 예

 

핵심은 숫자별 약수의 개수를 구하고, 조건에 따라 무기의 공격력 값을 변경한다!!

 

🔍 문제 풀이 (feat. 접근 방법)

1. 먼저 약수의 개수를 구한다.

2. 만약 개수가 협약 제한수치(limit) 보다 크다면 협약 공격무기(power)를 구매해야 한다.

3. 무기의 공격력이 담긴 배열의 합계를 계산하여 return 한다.

 

👩🏻‍💻 전체 코드

import java.util.*;
import java.util.stream.*;

class Solution {
    public int solution(int number, int limit, int power) {
        int[] cntArr = new int[number];
        
        for (int i = 0; i < number; i++) {
            // 각 약수를 구하는 함수를 호출
            cntArr[i] = countOfDivisor(i + 1);
            // limit, power 조건 적용
            if (cntArr[i] > limit) {
                cntArr[i] = power;
            }
        }
        
        // 배열의 합계를 계산하여 return
        return Arrays.stream(cntArr).sum();
    }
    
    // 각 숫자별 약수의 개수를 구하는 함수
    public int countOfDivisor(int num) {
        int divisorCount = 0;

        // 절반까지만 계산 
        for (int i = 1; i * i <= num; i++) {
            if (i * i == num) {
                divisorCount++;
            } else if (num % i == 0) {
                divisorCount += 2;
            }
        }

        return divisorCount;
    }
}