본문 바로가기
백준알고리즘

백준알고리즘:p1002 터렛

by socialcomputer 2021. 4. 4.

분류: 기본수학2

 

문제

 

 

코드

//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨 
package math_2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class p1002 {
//터렛
	public static void main(String[] args) {
		//입력 : x1, y1, r1, x2, y2, r2
		try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));){
			int n = Integer.parseInt(br.readLine());
			for(int i=0; i<n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int r1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());
			int r2 = Integer.parseInt(st.nextToken());
			
			int d = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);//sqrt쓰면 실수 오차있을 가능성 있어서 제곱한 채로 비교
			int r = (r1+r2)*(r1+r2);
			int subR= (r1-r2)*(r1-r2);//두 반지름의 차이 의 제곱
			//거리가 0일때
			if(d==0) {
				if(r1==r2) bw.write("-1\n");
				else bw.write("0\n");
			}
			else {//거리가 0이상일때
				if(r==d || subR==d) bw.write("1\n");
				else if(r>d && subR<d) bw.write("2\n"); //이게 살짝 헷갈렸음
				else bw.write("0\n");
			}
				
			}
			br.close();bw.close();
		}catch (Exception e) {e.printStackTrace();}

	}

}

▶처음에 너무 쉽게 봤다가 다시 케이스를 나눴다. 한 원이 안에 있을 경우를 계산하지 않은것..

출처 : https://mathbang.net/101

d>0일때

(2) d=r1+r2 이거나 (3) d=r1-r2

->1개

(1) d<r1+r2 이고 r1-r2<d 

 : 내접하는 경우(3) 초과 ~ 외접하는 경우(1) 미만

->2개

 

d=0일때

완전 겹치는 경우 r1=r2

무한개 -> -1

 

 

 


채점결과

....BufferedReader 와 BufferedWriter 사용

 

링크 www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

댓글