개발 기록일지

[LV1]소수 만들기(JAVA) 본문

프로그래밍/알고리즘 풀기

[LV1]소수 만들기(JAVA)

JuoDev 2022. 3. 30. 17:07

https://programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

 

문제 설명

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

제한사항
  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

 

입출력 예
num 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을 만들 수 있습니다.

 

 

 


nums 배열이 주어지면 그중 3개를 골라서 다 더하고 그게 소수인지를 판별하면 되는 문제이다.

 

for문 3개를 써서 처음부터 순서대로 

1 2 3

1 2 4

2 3 4

 

1 2 7

1 2 6

1 2 4

2 7 6

2 7 4

7 6 4

 

이런식으로 완탐해서 각각 값을 변수에 담아서 그게 소수이면 카운트를 증가시키면 된다.

소수는 1과 자기 자신으로만 나누어지는 숫자이다.

 

소스

class Soulution{
public int solution(int[] nums) {
		int answer = 0;

		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 sum = nums[i] + nums[j] + nums[k];
					if (isPrime(sum) == true) {
						answer++;
					}

				}
			}
		}

		return answer;
	}

	private boolean isPrime(int n) {
		for (int i = 2; i <= (int) Math.sqrt(n); i++) {
			if (n % i == 0)
				return false;
		}

		return true;
	}
}

 

근데 여기서 소수를 판별하는 isPrime 에서

 

배열에서 3개를 골라서 더한값

예를들어 n=30 이라고 가정하면

 

30은 

1*30

2*15

3*10

5*6

6*5

10*3

15*2

30*1

 

색깔이 변하는 기점으로 좌우 대칭인걸 알 수 있다.

그래서 sqrt 값보다 같거나 작은 값으로 나누어주면 그 이후에 대해서는 계산할 필요가 없다.

 

루트30 이면 5.xxx 값이고 5까지 나누었을때 나머지가 0이면 소수라고 볼 수 없는것이다.

 

그래서 i의 범위는 java의 내장함수를 사용해 

i <= (int)Math.sqrt(n) 으로 지정해주면된다.