티스토리 뷰

반응형

img


📎 간략한 문제 정리


  • 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구합니다.

📈 문제 분석


  • 문제의 조건이 최대 50개이므로 3가지 요소를 정할 때 3중 for문으로 접근해도 속도 이슈가 발생하지 않습니다.

🙋‍♂️ 내가 처음 생각한 해결 방법


  • 3중 for문을 통해 요소 3가지를 선택하고 isPrime 메소드를 통해 소수인지 판별합니다. 소수 판별 시 n-1까지 체크하는 것이 아니라 sqrt(n-1)까지 확인하면 됩니다.

💻 풀이한 코드


import Foundation

func solution(_ nums:[Int]) -> Int {
    var numsSum: [Int] = []
    for i in 0 ..< nums.count - 2 {
        for j in i+1 ..< nums.count - 1 {
            for k in j+1 ..< nums.count {
                numsSum.append(nums[i]+nums[j]+nums[k])
            }
        }
    }
    return numsSum.filter(isPrime(checkNumber:)).count
}

func isPrime(checkNumber: Int) -> Bool {
    let criterion = Int(Double(checkNumber).squareRoot())
    for i in 2...criterion {
        if checkNumber % i == 0 {
            return false
        }
    }
    return true
}

📝 해결 과정에서 만난 문제, 고민들


  • Python의 경우 permutation이 라이브러리 존재하지만 Swift에는 없으므로 직접 구현해야합니다. 하지만 문제에서는 3개로 항의 개수가 정해져있으므로 단순 for문을 통해 구현 가능했습니다.

  • 문제의 조건이 부족해서 문제가 발생했습니다. 기본 배열에 중복된 숫자가 들어있지 않다는 조건이 있지만 합이 중복이 되는 경우 카운팅하는지에 대한 조건이 없습니다. 이 문제는 중복된 숫자는 존재하지 않지만 중복된 합은 다르게 여기기 때문에 위의 풀이로 진행합니다. 하지만 만약에 중복된 합을 개수에 포함시키지 않으면 numsSum만 변경하면 됩니다.

    // var numsSum: [Int] = []
    var numsSumSet: Set<Int> = []
    // numsSum.append(nums[i]+nums[j]+nums[k])
    numsSumSet.insert(nums[i]+nums[j]+nums[k])

https://programmers.co.kr/learn/courses/30/lessons/12977?language=swift

반응형
댓글