오늘은 주어진 배열에서 서로 다른 3개의 숫자를 선택하여 합했을 때, 그 값이 소수가 되는 경우의 개수를 찾는 문제를 풀었다. 이를 위해 소수 판별 함수를 작성하고, 3중 for문을 사용하여 모든 조합을 탐색하는 방식으로 문제를 해결했다.
소수 판별 함수 작성: 소수는 1과 자기 자신 외에는 나누어 떨어지지 않는 수다. 이를 판별하기 위해 소수 판별 함수를 작성했다. number의 제곱근까지만 나누어 떨어지는지 확인하면 소수인지 아닌지를 빠르게 확인할 수 있다.
3개의 숫자 조합 찾기: nums 배열에서 서로 다른 3개의 숫자를 선택해야 하므로, 3중 for문을 사용하여 모든 가능한 조합을 만들고 그 합을 구한다.
합이 소수인지 확인: 각 조합의 합을 소수 판별 함수에 넣어 소수인지 확인하고, 소수라면 카운트를 증가시킨다.
import Foundation
// 소수 판별 함수
func isPrime(_ number: Int) -> Bool {
if number < 2 { return false } // 2 미만은 소수가 아님
for i in 2...Int(Double(number).squareRoot()) {
if number % i == 0 {
return false
}
}
return true
}
func solution(_ nums: [Int]) -> Int {
var count = 0
// 3개의 숫자를 선택하여 모든 조합을 확인
for i in 0..<nums.count {
for j in i+1..<nums.count {
for k in j+1..<nums.count {
let sum = nums[i] + nums[j] + nums[k]
if isPrime(sum) {
count += 1
}
}
}
}
return count
}
소수 판별 함수 isPrime(_:)
입력받은 number가 소수인지 확인한다. number가 2 미만이면 소수가 아니므로 false를 반환한다.
2부터 number의 제곱근까지 반복하면서 number가 나누어 떨어지는지 확인한다.
만약 나누어 떨어지면 소수가 아니므로 false를 반환하고, 나누어 떨어지지 않으면 true를 반환한다.
조합 탐색 및 소수 카운트
nums 배열의 인덱스를 3중 for문으로 순회하면서 모든 가능한 서로 다른 3개의 숫자 조합을 찾는다.
각 조합의 합을 sum에 저장하고, isPrime(sum) 함수를 사용해 sum이 소수인지 판별한다.
sum이 소수라면 count를 증가시킨다.
결과 반환
모든 조합을 탐색한 후, 소수인 합의 개수 count를 반환하여 최종 결과를 얻는다.
입출력 예시
예제 1: nums = [1, 2, 3, 4]
조합 (1, 2, 4)의 합은 7이며, 7은 소수다.
결과: 1
예제 2: nums = [1, 2, 7, 6, 4]
조합 (1, 2, 4), (1, 4, 6), (2, 4, 7), (4, 6, 7)의 합이 각각 7, 11, 13, 17이며, 모두 소수다.
결과: 4
소수 판별 최적화: 모든 숫자를 확인하는 것이 아니라 제곱근까지만 검사하는 것이 훨씬 효율적이라는 점을 다시 확인했다. 이를 통해 소수 판별의 시간을 줄일 수 있었고, 큰 수의 경우에도 성능이 개선되었다.
모든 조합 탐색의 중요성: 문제의 요구사항을 충족시키기 위해 배열 내 모든 3개의 숫자 조합을 확인해야 했다. 이를 위해 3중 for문을 사용해 모든 경우를 꼼꼼하게 탐색하는 것이 중요한 포인트였다.
조합을 위한 반복문 작성: nums 배열의 인덱스를 3중 for문으로 순회하여 모든 가능한 조합을 찾는 부분에서 처음에는 다소 혼란스러웠다. i, j, k가 서로 다른 숫자를 가리키도록 조건을 설정하는 데 주의가 필요했다.
소수 판별의 정확성: 소수를 정확하게 판별하기 위해 예외 조건을 꼼꼼하게 설정해야 했다. 특히, 작은 숫자나 특정 수의 경우 소수 조건을 확실하게 설정하는 것이 중요했다.
배운 점
이번 문제를 통해 소수 판별 로직과 3중 for문을 통한 조합 탐색을 다루는 법을 익혔다. 특히, 소수를 판별할 때 제곱근까지만 검사하면 효율적으로 판별할 수 있다는 점을 다시 확인했다. 앞으로 더 복잡한 조합 문제나 소수 판별 문제에서도 활용할 수 있을 것 같다.