일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Django
- Naver boostcourse
- 네이버
- AI Tech
- 파이썬
- sts
- 구현
- 장고
- Naver boostcamp
- 4기
- 백준
- boostcourse
- 백엔드
- BOJ
- 프로그래밍
- cs50
- 서블릿
- P Stage
- 레벨2
- AI Tech 4기
- 서버
- 웹
- Customer service 구현
- 2021 Dev-matching 웹 백엔드 개발자
- 부스트캠프
- 대회
- QNA 봇
- 프로그래머스
- 웹 프로그래밍
- 풀스택
- Today
- Total
daniel7481의 개발일지
[BOJ]1002 터렛 본문
https://www.acmicpc.net/problem/1002
문제
조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다. 다음은 조규현과 백승환의 사진이다.
이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.
조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.
한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.
출력
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
풀이
solved.ac 8각형에서 기하학이 극도로 낮아서 기하학 문제를 풀어보려고 했다. 기하학이란 이름은 왠지 무섭지만? 그래도 풀 수 있다고 생각했다. 위 문제는 각 터렛의 위치를 하나의 원으로 생각하면서 풀었다. 각 원에서부터의 거리가 반지름이고, 위치가 중심인 원 두개를 생각하고, 두 중심 사이의 거리와 r1, r2반지름을 비교하며 다음과 같이 분류했다.
1. 만약 두 원이 일치하면 가능한 점이 원의 집합이므로 무한: -1
2. 만약 두 원이 내접하면(두 중심 사이의 거리가 반지름 중 긴 것에서 작은 것을 뺀거라면): 1
3. 만약 두 원이 외접하면(두 중심 사이의 거리가 반지름 두개를 더한 것과 같다면): 1
4. 만약 한 원이 다른 원 안에 있고 내접하지 않는다면( 두 중심 사이의 거리가 반지름 중 긴 것에서 작은 것을 뺀 것보다 작다면) :0
5. 만약 두 원이 접하는 부분이 없다면(두 중심 사이의 거리가 반지름 두개를 더한 것보다 크다면):0
6. 그 외의 경우는 접점이 두개이므로 : 2
여기서 중요한 점은 두 중심 사이의 거리와 반지름을 비교할 때 제곱한 값을 비교해야 한다는 것이다. 먼저 두 중심 사이의 거리를 피타고라스 원리를 이용해서 구한다면 소수점으로 나올 가능성이 있는데 컴퓨터에서 소수점은 분명히 오차가 존재하기 때문에 제곱근을 사용하면 안된다.
def turret(x1, y1, r1, x2, y2, r2):
R = (x1-x2)**2 + (y1-y2)**2
if x1 == x2 and y1 == y2 and r1 == r2:
return -1
if R == (r1-r2)**2:
return 1
elif R == (r1+r2)**2:
return 1
elif R < (r1-r2)**2:
return 0
elif R > (r1+r2)**2:
return 0
else:
return 2
t = int(input())
for _ in range(t):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
print(turret(x1, y1, r1, x2, y2, r2))
'BOJ' 카테고리의 다른 글
[BOJ] 2075 N번째 큰 수 (0) | 2021.12.16 |
---|---|
[BOJ] 1976 여행 가자 (0) | 2021.12.13 |
[BOJ] 2589 보물섬 (0) | 2021.12.10 |
[BOJ] 13904 과제 (0) | 2021.12.09 |
[BOJ] 2609 최대공약수와 최소공배수 (0) | 2021.12.09 |