[백준 1002번 : 터렛] java 풀이

Elmo·2022년 8월 5일
0

[백준] 알고리즘

목록 보기
28/39

🔔기하1 - 터렛

고등학교 시절로 돌아간 기분...

중심점 사이의 거리와 반지름으로 두 원과의 교점 개수를 구한다.


1) 원의 중심점이 같을 경우

  • 반지름이 다른 경우 : 0개
  • 반지름이 같은 경우 : 무한대

2) 원의 중심점이 다를 경우

  • 원이 외부에서 떨어져 있을 경우 : 0개
  • 한 원이 다른 원 안에 있고 떨어져 있을 경우 : 0개
  • 외접, 내접할 경우 : 1개
  • 원의 일부가 겹쳐져 있을 경우 : 2개

🔑 java 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(br.readLine());//테스트 개수
		int x1,y1,r1,x2,y2,r2;
		double d;//(x1,y1)와 (x2,y2)사이의 거리
		for(int i=0; i<T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine()," ");
			x1=Integer.parseInt(st.nextToken());
			y1=Integer.parseInt(st.nextToken());
			r1=Integer.parseInt(st.nextToken());
			x2=Integer.parseInt(st.nextToken());
			y2=Integer.parseInt(st.nextToken());
			r2=Integer.parseInt(st.nextToken());
			
			d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
			
			if(x1==x2 && y1==y2) {//중심점이 같을 경우
				if(r1==r2)//반지름이 같으면 무한대(원이 같음)
					sb.append(-1+"\n");
				else//반지름이 다르면 0개(원이 겹치지 않음)
					sb.append(0+"\n");
			}
			else {//원이 중심점이 다를 경우
				if(r1+r2 < d || (r1-r2)*(r1-r2)>d*d)//원이 서로 바깥 or 내부에서 떨어져있을 경우
					sb.append(0+"\n");//0개
				else if(r1+r2==d || (r1-r2)*(r1-r2)==d*d)//원이 외접하거나 내접할 경우
					sb.append(1+"\n");//1개
				else if((r1-r2)*(r1-r2)<d*d && d*d<(r1+r2)*(r1+r2))//원이 서로 일부가 겹쳐져 있을 경우
					sb.append(2+"\n");//2개
			}
		}
		System.out.print(sb);
		br.close();
	}
}

이 문제는 중심점이 같냐 안같냐, 외접이냐 내접이냐 등 기준을 잘 세워야한다...
처음에 기준을 잘못 세워서 몇 번 틀렸다 ㅠ
나 고등학교때 수학 어떻게 했냐..?

profile
엘모는 즐거워

0개의 댓글