https://school.programmers.co.kr/learn/courses/30/lessons/12977
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제를 단순하게 정리하자면, 주어진 문제는 배열에 있는 숫자들 중에 3개를 골라 더했을때 소수가 되는 경우의 개수를 구하면 되는 문제이다.
처음에 딱 보고 든 생각은 다음과 같다.
3개의 수는 어떻게 뽑을 것인가..?
방법 1. ) 사실 단순한 방법은 for문을 3번 돌리면서 값을 구한뒤 , 그 값이 소수인지를 판별하는 것이다.
방법 2. ) 배열의 조합 값들을 모두 찾아내서 정리한뒤 ( 재귀나 백트래킹 이용 ) 조합의 합이 소수인지를 판별하는 것이다.
그래서 일단 두가지 방법을 모두 구현해보고자 했다.
방법 1. - for문을 3번 돌리면서 값을 구하고 그 값을 소수 판별하기
class Solution {
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 target = nums[i] + nums[j] + nums[k];
if(isPrime(target)) answer++;
}
}
}
return answer;
}
private boolean isPrime(int target) {
for (int i = 2; i <= Math.sqrt(target); i++) {
if (target % i == 0) {
return false;
}
}
return true;
}
}
코드만 봐도 그렇게 어렵지 않다.
방법 2. 백트래킹을 이용해서 만들수 있는 조합 리스트를 만든뒤, 해당 조합의 합이 소수를 만족하는지 판별하기
import java.util.ArrayList;
class Solution {
static ArrayList<Integer> list;
public int solution(int[] nums) {
boolean[] visited = new boolean[nums.length];
list = new ArrayList<>();
comb(nums, visited, 0, nums.length, 3 );
return list.size();
}
void comb(int[] arr, boolean[] visited, int start, int n, int r) {
if (r == 0) {
print(arr, visited, n);
return;
}
for (int i = start; i < n; i++ ) {
visited[i] = true;
comb(arr, visited, i + 1, n, r - 1);
visited[i] = false;
}
}
void print(int[] arr, boolean[] visited, int n) {
int target =0;
for (int i = 0; i < n; i++) {
if (visited[i]) {
target += arr[i];
}
}
if (isPrime(target)) {
list.add(target);
}
}
private boolean isPrime(int target) {
for (int i = 2; i <= Math.sqrt(target); i++) {
if (target % i == 0) {
return false;
}
}
return true;
}
}