Processing math: 100%

II-eugene-II Note

Home Math Code
백준 22938번 - 백발백준하는 명사수

백준 22938번 문제 링크
문제 이름 : 백발백준하는 명사수
주 언어 : Python
태그 : 수학 / 기하학 / 피타고라스 정리
solved.ac 등급 : Bronze III (2022/12/01 확인)


문제 보기

문제 :

백발백준은 무슨 과녁이던 백발백중하여 올림픽 금메달보다 따기 어렵다는 대한민국 양궁 국가대표 타이틀을 가지고 있다. 이런 백발백준이 현재 연마하는 스킬이 있는데...
바로 두 과녁을 한번에 맞추는 스킬이다. 이를 연습하기 위해 두 과녁이 겹치는 부분이 있어 한번에 맞추기가 가능한지 알아보고 싶어졌다.
여러분은 백발백준이 연습하는 과정을 도와주기 위해 원 모양으로 생긴 두 과녁이 겹치는 부분이 존재하는지 확인하는 프로그램을 작성해보자.

입력 :

첫번째 줄에는 첫번째 과녁의 중심 X1, Y1와 반지름 R1이 주어진다.
두번째 줄에는 두번째 과녁의 중심 X2, Y2와 반지름 R2가 주어진다.
X1, X2, Y1, Y2는 모두 정수이며, R1, R2는 모두 자연수이다.
109X1,X2,Y1,Y2109, 0<R1,R2109

출력 :

두 과녁이 겹치면 YES, 아니면 NO를 출력한다.
단, 두 과녁이 한 점에서 만나는 경우는 겹치지 않는 것으로 생각한다.



(제목 오타 낸거 아닙니다.)
두 과녁의 중심 간의 거리를 D라고 할 때, D<R1+R2이면 (즉, 두 점 사이의 거리보다 두 원의 반지름의 합이 더 크다면) 두 과녁은 무조건 만나게 됩니다.
복잡한 증명보다는 한번 포스트잇이든 종이든 그림판이든 직접 그리면서 체험해보시면 좋을 듯 합니다.
두 점 사이의 거리 D=(x2x1)2+(y2y1)2이므로, (x2x1)2+(y2y1)2<R1+R2인지를 판정해주는 문제로 바뀌게 됩니다.
저는 개인적으로 실수형 변수를 거의 아예 안 믿으므로, (x2x1)2+(y2y1)2<R1+R2 인지 판정하기보단 (x2x1)2+(y2y1)2<(R1+R2)2인지를 판정해주었습니다.
파이썬이 아닌 다른 언어에서는 int 대신 long long int 형을 써주면 오버플로우 없이 가능합니다.

x1, y1, r1 = input().split()
x1 = int(x1)
y1 = int(y1)
r1 = int(r1)
x2, y2, r2 = input().split()
x2 = int(x2)
y2 = int(y2)
r2 = int(r2)
if (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) < (r1 + r2) * (r1 + r2):
print("YES")
else:
print("NO")
view raw BOJ22938.py hosted with ❤ by GitHub

정수로 가능한 연산은 되도록이면 정수로 해주도록 합니다.


-번째 푼 문제 (2022/--/--)