Home [Lv.1] 소수 만들기
Post
Cancel

[Lv.1] 소수 만들기

문제 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한조건
  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예시
numsresult
[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);
	}
}

[성공]


프로그래머스에서 문제 확인

This post is licensed under CC BY 4.0 by the author.