해당 문제 는 제가 예전에 풀었던 소수 찾기 문제와 경우의 수 문제를 참고했습니다.
문제의 핵심은 숫자 세 개를 빠짐 없이 더하는 루프와, 소수를 구하는 함수인데요. 0과 1은 소수가 아니기 때문에 함수의 for문 시작점은 2부터 세 자리수의 제곱근까지의 범위로 설정하고, 나누어 떨어지지 않는 경우 result를 누적 증가 시켜주는 방식으로 문제를 풀었습니다.
그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.
- 자바스크립트 버전
// 소수를 구하는 함수 function isPrime(sum){ // 0과 1은 제외이므로 false를 반환 if(sum === 0 || sum === 1) return false; // 2부터 세 자리수의 합의 제곱근 까지 연산을 하면서 차례대로 sum을 나눌 때 0으로 나누어 떨어지면 소수가 아니므로 false를 반환 for(let i = 2 ; i <= Math.sqrt(sum) ; i++){ if(sum%i === 0) return false; } // 위의 조건들에 걸리지 않으면 소수이므로 true를 반환 return true; } function solution(nums) { // 반환할 result값 let result = 0; // // 3중 for문 for(let i = 0; i < nums.length ; i++){ for(let j = i+1; j < nums.length ; j++){ for(let k = j+1; k < nums.length ; k++){ let sum = nums[i] + nums[j] + nums[k]; if(isPrime(sum)) result++; } } } return result }
그리고 자바 버전으로 구현한 코드는 다음과 같습니다.
- 자바 버전
public class Solution { // 소수를 판별하는 함수 public boolean isPrime(int sum) { // 0과 1은 소수가 아니므로 false 반환 if (sum == 0 || sum == 1) return false; // 제곱근까지만 반복하여 소수 판별 for (int i = 2; i <= Math.sqrt(sum); i++) { if (sum % i == 0) return false; // 나누어 떨어지면 소수가 아님 } // 위 조건에 해당하지 않으면 소수이므로 true 반환 return true; } // 솔루션 메소드 public int solution(int[] nums) { int result = 0; // 3중 for문으로 조합 구하기 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]; if (isPrime(sum)) result++; } } } return result; } }
JS
의 경우 배열에 유동적인 접근이 가능하지만, 자바
의 경우 문자열과 문자를 취급하는 메서드가 각각 달라 꽤 애를 먹은 기억이 있습니다. 특히나 valueOf나 indexOf의 메서드는 각각 취급하는 매개 변수의 타입이 달라 특히나 더 헷갈렸든 듯 합니다.
사실 이번 문제는 로직이 동일해서 JS와 자바 둘 다 별 무리없이 풀었는데요. 다만 소수를 구하는 다른 방법이나, 다중 for문 말고 다른 방법으로 경우의 수를 구하는 방법을 찾아볼 필요가 있겠다고 느꼈던 문제였습니다.