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