문제
주어진 숫자 중 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 |
C#
주어진 숫자 중 3개를 더하는 효율적인 방법을 생각하는 것이 중요한 포인트라고 생각함.
- 2이상의 모든 짝수는 소수가 아님 → 홀수가 되는 경우의 수 : (짝 + 짝 + 홀) OR (홀 + 홀 + 홀)
- 3중 for문을 돌면서 데이터의 합을 구할 때 짝짝홀, 홀홀홀이 아니면 스킵하도록 함.
- 곱하기는 더하기의 연속 →짝수번 더한 값은 절대 소수가 될 수 없기 때문에 나머지를 통해 소수를 확인할 때도 홀수만 확인 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.Collections.Generic;
using System.Linq;
using System;
class Solution
{
public int solution(int[] nums)
{
Dictionary<int, int> dicNums = new Dictionary<int, int>();
foreach (int num in nums)
{
dicNums.Add(num, num % 2);
}
List<int> list = new List<int>();
for (int i = 0; i < nums.Length; i++)
{
for (int j = (i + 1); j < nums.Length; j++)
{
for (int k = (j + 1); k < nums.Length; k++)
{
int typeSum = dicNums[nums[i]] + dicNums[nums[j]] + dicNums[nums[k]];
if (typeSum == 1 || typeSum == 3)
{
list.Add(nums[i] + nums[j] + nums[k]);
}
}
}
}
int cnt = 0;
foreach (var item in list)
{
if(ChkPrimeNum(item, item - 2) > 0)
cnt++;
}
return cnt;
}
public int ChkPrimeNum(int num, int divideNum)
{
if (divideNum == 1)
return num;
else if (num % divideNum == 0)
return -1;
return ChkPrimeNum(num, divideNum - 2);
}
}
[성공]
프로그래머스에서 문제 확인