https://school.programmers.co.kr/learn/courses/30/lessons/12977
문제 접근
Map은 중복을 거른다.
경우의 수 갯수를 구하기 때문에 합산된 수는 중복이 될 수 있다.
소수를 구하는 방식은 2부터 자신의 수-1까지 하나씩 나눠보면서 0으로 나눠지는 지 확인
import java.util.*;
class Solution {
public int solution(int[] nums) {
int answer = 0;
List<Integer> list = new ArrayList<>(); // 소수 담는 공간
// list에 넣은 숫자 순서대로 소수인지 판별하는 배열
// 조합으로 크기 정하고, 소수라면 false
boolean[] bool = new boolean[(nums.length * (nums.length-1) * (nums.length-2))/6];
int count = 0; // count로 합산된 수 순서 맞춰줌
for(int i=0; i<nums.length-2; i++) { // 1
for(int j=i+1; j<nums.length-1; j++) { // 2
for(int k=j+1; k<nums.length; k++) { // 3
int sum = nums[i] + nums[j] + nums[k];
list.add(sum);
for(int m=2; m<sum; m++) {
if(sum % m == 0) { // 한 번이라도 나눠진 수는 소수 탈락
bool[count] = true;
break;
}
}
count++;
}
}
}
for(boolean b : bool) if(b == false) answer++; // 소수 갯수 세기
return answer;
}
}
다른 사람 풀이
소수를 판단하는 메서드를 따로 만들어서 0으로 나눠지는 횟수에 따라 소수인지 구분하였음
class Solution {
public int solution(int[] nums) {
int ans = 0;
for(int i = 0; i < nums.length - 2; i ++){
for(int j = i + 1; j < nums.length - 1; j ++){
for(int k = j + 1; k < nums.length; k ++ ){
if(isPrime(nums[i] + nums[j] + nums[k])){ // 합산된 수가 소수인지 판별하는 메서드
ans += 1;
}
}
}
}
return ans;
}
public Boolean isPrime(int num){
int cnt = 0;
for(int i = 1; i <= (int)Math.sqrt(num); i ++){ // 합산된 수의 제곱근까지 돌기, 약수는 대칭성을 가져서 제곱근까지 돌린듯
if(num % i == 0) cnt += 1; // 0으로 나눠지면 소수가 아니다, 1로 나눠도 나머지는 0
}
// 1로 나눴을 때를 포함해 cnt가 1을 초과하면 1외에 약수를 여러 개 가진 것
return cnt == 1; // cnt가 1이면 true 반환
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 문자열 내 마음대로 정렬하기 / JAVA] (0) | 2023.03.22 |
---|---|
[프로그래머스 / 소수 찾기 / JAVA] (0) | 2023.03.22 |
[프로그래머스 / [1차] 비밀지도 / JAVA] (0) | 2023.03.20 |
[프로그래머스 / [1차] 다트 게임 / JAVA] (2) | 2023.03.19 |
[프로그래머스 / 완주하지 못한 선수 / JAVA / 해시] (1) | 2023.03.17 |
댓글