1004번: 어린 왕자
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주...
www.acmicpc.net
import sys
import math
from collections import deque
input = sys.stdin.readline
T = int(input())
def is_in(p,x,y):
cx,cy,r = p
len_x = abs(x-cx)
len_y = abs(y-cy)
rg = math.sqrt(len_x**2 + len_y**2)
if rg <= r:
return True
return False
def min_in_out(sx,sy,es,ey,planets):
cnt = 0
for p in planets:
if is_in(p,sx,sy) and not is_in(p,es,ey):
cnt+=1
elif not is_in(p,sx,sy) and is_in(p,es,ey):
cnt+=1
return cnt
for _ in range(T):
sx,sy,es,ey = map(int,input().split())
n = int(input())
planets = [list(map(int,input().split())) for i in range(n)]
answer = min_in_out(sx,sy,es,ey,planets)
print(answer)
풀이
다양한 방법으로 풀 수 있을 것 같은데 나는 아래와 같이 생각했다.
일단 한 원이 있다고 하자.
이 원안에 시작점과 끝점이 둘 다 존재하면 둘 사이에 경계가 없다.
또한 시작점과 끝점 둘 다 밖에 존재하면 둘 사이에 경계가 없다.
즉 시작점과 끝점 둘 중 하나만 안에있고 하나는 밖에 있을 때 경계가 생긴다.
점이 원 안에 존재하는지 체크하는 방법은 피타고라스 정리를 사용한다.
시작점 or 도착점 둘 중 하나만 포함되는 경우는 cnt+=1
cnt가 답이된다.
시간복잡도
원의 수만큼 로직을 돌리면 되기때문에 O(N)이다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1034] 램프 (0) | 2021.05.12 |
---|---|
[백준 1027] 고층 건물 (0) | 2021.05.12 |
[백준 15954] 인형들 (0) | 2021.05.11 |
[백준 1188] 음식 평론가 (0) | 2021.05.11 |
[백준 17218] ⚾ (0) | 2021.05.07 |
댓글