[문제] 기사단원의 무기
https://school.programmers.co.kr/learn/courses/30/lessons/136798
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int number, int limit, int power) {
int answer = 0;
int divisor = 0;
int final_power = 0;
int power_sum = 0;
for (int i = 1; i <= number; ++i)
{
// 대원 한 명씩 약수 개수 구하기
for (int j = 1; j <= i; ++j)
{
if (i % j == 0)
{
++divisor;
}
}
if (divisor > limit)
{
final_power = power;
}else
{
final_power = divisor;
}
power_sum += final_power;
divisor = 0;
}
answer = power_sum;
return answer;
}
[풀이 과정]
약수를 구하면서 완전 탐색 방식으로 for loop으로 1~기사 숫자까지 모두 순회하면서 약수인지 아닌지 판단
-> 각 기사의 약수 개수를 divisor 변수에 저장
-> 해당 기사의 divisor가 다 구해지면, limit을 초과하는지 아닌지 판단해서 최종 공격력을 power_sum에 저장함
-> 모든 기사의 무기 공격력이 다 합쳐지면 그게 정답.
[개선점 탐구]
약수를 완전탐색이 아닌 다른 방식으로 찾을 수 있을 것 같다.
-> 약수를 구할 때는, 원래 숫자의 제곱근까지만 찾으면 된다.
15의 약수를 구한다고 생각했을 때, 3으로 나눠서 5로 나누어떨어진다. 이 경우 5도 15의 약수이기 때문에 약수 두 개를 동시에 구할 수 있다. 원래 숫자의 제곱근 X 제곱근이 중간에 존재할 것이기 때문에, 제곱근을 기준으로 양쪽의 약수들을 한번에 구할 수 있다.
예시) 16: 1 * 16, 2 * 8, 4 * 4, 8 * 2, 16 * 1
제곱근을 기준으로 양쪽에 같은 약수들이므로 굳이 4 * 4 이후까지 안 가도 된다는 뜻.
'C언어 공부 > 코드 테스트 연습' 카테고리의 다른 글
| 2026/07/28 코드카타 (0) | 2026.07.28 |
|---|---|
| 2026/7/24 코드카타 (1) | 2026.07.24 |