728x90
반응형
Level1. 소수 만들기
ㆍ문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
ㆍ 제한사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
ㆍ 입출력 예
nums | 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을 만들 수 있습니다.
나의 풀이
class Solution {
public int solution(int[] nums) {
int x = 0;
int y = 1;
int z = 2;
int maxIndex = nums.length;
int cnt = 0;
while (z < maxIndex
&& y < maxIndex - 1
&& x < maxIndex - 2) {
if (isPrime(nums[x] + nums[y] + nums[z])) {
cnt++;
}
if (z < maxIndex - 1) {
z++;
continue;
} else if (y < maxIndex - 2) {
y++;
z = y + 1;
continue;
} else if (x < maxIndex - 3) {
x++;
y = x + 1;
z = y + 1;
continue;
}
break;
}
return cnt;
}
private boolean isPrime(int num) {
if (num == 1) {
return false;
}
for (int i = 1; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
- 숫자를 더하는 개수가 3개로 정해져 있으므로, 3개의 포인터를 사용하여 배열을 순차적으로 탐색하였다.
- 소수를 판별하는 반복 회수가 num의 제곱근인 이유는 당연하게도, num의 제곱근을 제곱해야 num이 되기 때문에 num 제곱근 이상의 숫자로 나누어질 경우는 조건절 이전에 판별이 되기 때문이다.
다른 사람의 풀이
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 sum = nums[i] + nums[j] + nums[k];
answer += isPrime(sum) ? 1 : 0;
}
}
}
return answer;
}
private boolean isPrime(int num)
{
for (int i = 2; i <= Math.sqrt(num); i++){
if (num % i == 0)
{
return false;
}
}
return true;
}
}
- 같은 로직이지만 다른 코드이다. 3중 for문을 통해 3개의 원소를 선택하는 경우의 수를 순차적으로 탐색하게끔 했다.
- 이분의 순회 알고리즘이 더욱 가독성이 좋은 듯 하다.
참고
- https://blog.itcode.dev/posts/2021/12/14/programmers-a0009.html
728x90
반응형