레벨 1
https://programmers.co.kr/learn/courses/30/lessons/12977
주어진 수 중 3개의 수를 뽑아야했다. -> 백트래킹으로 접근
문제 채점 속도가 조금 느렸지만 정답이었다.
레벨1인데 복잡하게 생각한 것 같아서 다른 풀이를 찾아보니 for문으로 간단하게 세개의 수를 구할 수 있는 방법을 알게 되었다.
레벨1 수준에서 복잡하게 생각하지 말고 간단하게 풀 수 있는 방법으로 접근하는 방법을 기르자.
1) for문으로 세 수의 합 구하기
import java.util.*;
class Solution {
public int sum;
public int answer = 0;
public int solution(int[] nums) {
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++) {
System.out.println(nums[i] + " " + nums[j] + " " + nums[k]);
int num = nums[i] + nums[j] + nums[k];
if (isPrime(num)) {
answer++;
}
}
}
}
return answer;
}
public boolean isPrime(int x) {
if (x == 0 || x == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0)
return false;
}
return true;
}
}
1) 백트래킹으로 세 수의 합 구하기
import java.util.*;
class Solution {
public boolean[] visit;
public int[] arr;
public int sum;
public int answer = 0;
public int solution(int[] nums) {
visit=new boolean[nums.length];
arr = new int[3];
dfs(0,nums,0);
return answer;
}
public void dfs(int depth, int[] nums, int start) {
if (depth == 3) {
for (int val : arr) {
sum += val;
}
System.out.println(sum);
if (isPrime(sum)) {
answer++;
}
sum = 0;
return;
}
for (int i = start; i < visit.length; i++) {
if (!visit[i]) {
visit[i] = true;
arr[depth] = nums[i];
dfs(depth + 1, nums, i);
visit[i] = false;
}
}
}
public boolean isPrime(int x) {
if (x == 0 || x == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0)
return false;
}
return true;
}
}