[Leet.1828] Streak Day 96 🔥

·2025년 3월 16일
0

SwiftAlgorithm

목록 보기
101/105
post-thumbnail

1828. Queries on Number of Points Inside a Circle


문제 설명

  • 좌표상의 여러점들과 원들의 정보들이 주어진다.
  • 각 원들이 몇개의 점을 접하거나 포함하고 있는지, 개수를 담은 배열을 return

문제 풀이

class Solution {
    func countPoints(_ points: [[Int]], _ queries: [[Int]]) -> [Int] {
        var answer = [Int]()
        for circle in queries {
            let position = (circle[0], circle[1])
            let radius = circle[2]
            var cnt = 0
            for dot in points {
                if isInCircle((circle[0], circle[1], circle[2]), (dot[0], dot[1])) {
                    cnt += 1
                }
            }
            answer.append(cnt)
        }
        return answer
    }

    func isInCircle(_ position: (Int, Int, Int), _ dot_position: (Int, Int)) -> Bool {
        var extra = position.2

        let x_diff = abs(position.0 - dot_position.0)
        let y_diff = abs(position.1 - dot_position.1)
        if x_diff + y_diff > extra {
            return false
        }
        else {
            return true
        }
    }
}

이렇게 했는데 바로 기본테케만 넘어가고 바로 막혔다!
결국에는 아래처럼 애매한 눈대중 계산을 그만두고 공식을 사용해야겠다고 싶었다.

let x_diff = abs(position.0 - dot_position.0)
        let y_diff = abs(position.1 - dot_position.1)
        if x_diff + y_diff > extra {
            return false
        }

원의 내부점 공식

원의 중심이 (c1,c2)이고 타겟점이 (x,y)일때,

이에따라 점이 내부에 있는지 판단 기준을 업데이트해줬다.

let x_diff = (position.0 - dot_position.0)*(position.0 - dot_position.0)
        let y_diff = (position.1 - dot_position.1)*(position.1 - dot_position.1)

        if x_diff + y_diff > extra*extra {
            return false
        }

최종 제출 코드

class Solution {
    func countPoints(_ points: [[Int]], _ queries: [[Int]]) -> [Int] {
        var answer = [Int]()
        for circle in queries {
            var cnt = 0
            for dot in points {
                if isInCircle((circle[0], circle[1], circle[2]), (dot[0], dot[1])) {
                    cnt += 1
                }
            }
            answer.append(cnt)
        }
        return answer
    }

    func isInCircle(_ position: (Int, Int, Int), _ dot_position: (Int, Int)) -> Bool {
        let extra = position.2

        let x_diff = (position.0 - dot_position.0)*(position.0 - dot_position.0)
        let y_diff = (position.1 - dot_position.1)*(position.1 - dot_position.1)

        if x_diff + y_diff > extra*extra {
            return false
        }
        else {
            return true
        }
    }
}

타인의 코드

class Solution {
    func countPoints(_ points: [[Int]], _ queries: [[Int]]) -> [Int] {
        var arr = Array(repeating: 0, count: queries.count)

        for i in 0..<queries.count {
            var pointsInside = 0
            let r = queries[i][2]

            points.forEach { point in
                let xDiff = point[0] - queries[i][0]
                let yDiff = point[1] - queries[i][1]
                
                if xDiff*xDiff + yDiff*yDiff <= r*r {
                    pointsInside += 1
                }
            }

            arr[i] = pointsInside
        }

        return arr
    }
}

문제에서 알아내라고하는바가 뚜렷한데다가, 수식과 관련되어있어서 효율적인 풀이는 아까 언급했던 공식선에서 크게 벗어나지 않는 듯 보였다.

profile
기억보단 기록을

0개의 댓글