[프로그래머스] 12977 소수 만들기

최대 1 분 소요

프로그래머스 level2

문제


문제 풀이

class Solution {
static int count = 0;
public int solution(int[] nums) {
boolean[] visited = new boolean[nums.length];
combination(nums, visited, 0, nums.length, 3);
return count;
}
// 조합 : 중복X, 순서X - 백트래킹
// nums - 조합을 뽑아 배열, visited - 조합에 뽑혔는지 체크하는 배열, n - 배열의 길이, r - 조합의 길
// start를 기준으로 start 보다 작으면 뽑을 후보에서 제외, start 보다 크면 뽑을 후보가 된다.
public void combination(int[] nums, boolean[] visited, int start, int n, int r) {
if (r == 0) {
int sum = 0;
for (int i = 0; i < n; i++) { // 3개의 수 합 구하기
if (visited[i]) {
sum += nums[i];
}
}
if (isPrime(sum)) { //합이 소수인지 확인하기
count++; //소수이면 값 증가
}
return;
} else {
for (int i = start; i < n; i++) {
visited[i] = true;
combination(nums, visited, i + 1, n, r - 1);
visited[i] = false;
}
}
}
// 소수 판별 함수
public boolean isPrime(int n){
if (n <= 1) {
return false;
}
int a = (int) Math.sqrt(n);
for (int j = 2; j <= a; j++) {
if (n % j == 0) {
return false;
}
}
return true;
}
}
view raw P_12977.java hosted with ❤ by GitHub


문제 리뷰

주어진 배열에서 3개의 수를 더한 값이 소수가 되는 경우를 찾는 문제이다.

나는 조합을 이용하여 문제를 풀이했다.
저번에 비숫한 문제 를 순열로 풀었던터라 쉽게 방법을 떠올릴 수 있었다.
조합을 사용하면 중복과 순서 없이 수를 뽑을 수 있다.
조합 코드는 아래의 블로그 포스팅을 참고했다. 설명을 아주 쉽게 해놓으셨다!

조합으로 3개의 수를 뽑고 그 수의 합이 소수인지 판별한 후, 카운팅 해주었다.
사실 풀면서 완전탐색, 전역변수를 사용한터라
시간초과가 나지 않을까 걱정했는데 다행히 모두 통과했다.
좀 더 효율성 높은 방법을 고민해봐야겠다.

참고

TMI

불금!

1일 1알고리즘 완료🤓

댓글남기기