https://school.programmers.co.kr/learn/courses/30/lessons/12977
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
nums | result |
---|---|
[1, 2, 3, 4] | 1 |
[1, 2, 7, 6, 4] | 4 |
입출력 예 #1
[1, 2, 4]를 이용해서 7을 만들 수 있습니다.
입출력 예 #2
[1, 2, 4]를 이용해서 7을 만들 수 있습니다.
[1, 4, 6]을 이용해서 11을 만들 수 있습니다.
[2, 4, 7]을 이용해서 13을 만들 수 있습니다.
[4, 6, 7]을 이용해서 17을 만들 수 있습니다.
서로 다른 세 수의 합이 소수인지 판단하고, 소수가 되는 경우의 개수를 반환한다.
<소수>
1과 자기 자신만을 약수로 가지는 수
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// nums_len은 배열 nums의 길이입니다.
int solution(int nums[], size_t nums_len) {
int answer = 0;
int sum = 0;
for (int i = 0; i < nums_len; i++) { // 배열에서 숫자 3개 고르는 반복문
for (int j = i + 1; j < nums_len; j++) {
for (int k = j + 1; k < nums_len; k++) {
sum = nums[i] + nums[j] + nums[k]; // 중복되지 않은 3가지 숫자의 합
int count = 0; // sum의 약수의 개수 구할 변수
for (int h = 2; h < sum; h++) { // 약수의 개수를 구하는 반복문
if (sum % h == 0)
count++;
}
if (count == 0) // 약수의 개수가 0일 때 answer++
answer++;
}
}
}
return answer;
}
for 반복문을 이용하여 배열 nums에 있는 숫자가 겹치지 않게 3개의 수를 구한다.
구한 3개의 수의 합을 sum에 담는다.
ex) nums이 [1, 2, 3, 4]이면, nums_len = 4가 된다.
첫 번째: i=0, j=1, k=2 / sum = nums[0] + nums[1] + nums[2] = 1 + 2 + 3 = 6
두 번째: i=1, j=2, k=3 / sum = nums[1] + nums[2] + nums[3] = 2 + 3 + 4 = 9
세 번째: i=2, j=3, k=4 에서 k < nums_len 조건식이 만족하지 못하므로 반복문은 끝난다.
sum을 1과 자기 자신을 제외한 범위의 수 h로 나눈 나머지가 0이면
그 h가 sum의 약수가 되고, 약수의 개수만큼 count++를 해준다.
마지막 if문에서 count가 0이면, sum은 소수이기 때문에 answer++로 소수의 개수를 구하고 값을 반환한다.
혼자 풀기엔 어려워서 다른 분들의 코드를 참고했다.
처음엔 코드를 봐도 이해가 되지 않아서 힘들었지만 천천히 분석 하다보니 이해가 됐다.