강승현입니다
    • 홈
    • 태그
    • 방명록

    카테고리

    • 전체 글 (118)
      • 후기 (38)
        • 경험 (15)
        • SSAFY (9)
        • 코딩테스트 (3)
        • 넥스터즈 (6)
        • 회고 (5)
      • Degrees (2)
      • Tech (33)
      • OnlineJudge (45)
    OnlineJudge

    백준 1002 터렛 풀이 python, java

    CODe_byCODe_·2021. 1. 27. 23:35

    문제로이동


    목차

       



      문제 설명

      알고리즘 문제라기 보다는 수학에 많이 가깝습니다.

      두 원을 그려서 교점(겹치는 점)을 찾아내는 문제이며, 정답률이 많이 낮은 것으로 봐서는 여러 경우의 수를 고려하지 못했던 것 같습니다.

      물론 저도 정답률 낮추는 데 한 몫 했습니다 ^^

       

      경우의 수는 크게 4가지

       

      소스코드도 위와 같은 순서로 분리되어 있습니다.

       

      1. 원이 완전히 겹치는 경우 (출력값 0)

      두 원의 거리가 0이면서 반지름도 같은 경우를 말합니다.

       

      2. 원이 한쪽 면만 닿는 경우 (출력값 1)

      (내접) 두 원의 거리 == 원1 반지름 + 원2 반지름

      단, 원1 반지름과 원2 반지름의 길이를 비교해서 작은 값, 큰 값으로 분류해도 되지만 편의상 절대값 abs를 이용했습니다.

      내접 두 원의 거리 == abs(r1 - r2)

      (외접) 두 원의 거리 - r1 = r2

      아래 그림을 참고 바랍니다.

       

      3. 원이 겹치고 교점이 2개 생기는 경우 (출력값 2)

      2가지 경우가 있는데 이 두 조건을 모두 만족하면 됩니다. 그림은 아래를 참고해 주세요!

       

      4. 원이 아예 겹치지 않는 경우 (출력값 0)

      2가지 경우가 있는데 이는 else로 분류했기 때문에 따로 조건 설정을 하지 않았습니다.


      소스 코드

      Python

      import sys,math
      input = sys.stdin.readline
      
      t = int(input())
      while t:
          t-=1
          x1,y1,r1,x2,y2,r2 = map(int,input().rstrip().split())
          x = x2-x1
          y = y2-y1
          d = math.sqrt(x**2+y**2) #두 원 거리
          if d==0 and r1==r2:ans=-1
          elif d==abs(r1-r2) or r1+r2==d:ans=1
          elif abs(r1-r2)<d<r1+r2:ans = 2
          else:ans=0
          print(ans)

      Java8

      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 bf = new BufferedReader(new InputStreamReader(System.in));
      		StringTokenizer st = new StringTokenizer(bf.readLine());
      		int T= Integer.parseInt(st.nextToken());
      		for(int t = 0;t<T;t++) {
      			double x1,y1,r1,x2,y2,r2,d;
      			st = new StringTokenizer(bf.readLine());
      			x1 = Double.parseDouble(st.nextToken());
      			y1 = Double.parseDouble(st.nextToken());
      			r1 = Double.parseDouble(st.nextToken());
      			x2 = Double.parseDouble(st.nextToken());
      			y2 = Double.parseDouble(st.nextToken());
      			r2 = Double.parseDouble(st.nextToken());
      			double x = x2-x1;
      			double y = y2-y1;			
      			d =  Math.sqrt(x*x+y*y);
      			if(d==0 && r1==r2)//원이 완전히 겹치는 경우
      				System.out.println(-1);
      			else if(d==Math.abs(r1-r2) || r1+r2==d)//내접,외접			
      				System.out.println(1);
      			else if(Math.abs(r1-r2)<d && d<r1+r2)
      				System.out.println(2);
      			else
      				System.out.println(0);
      		}
      	}
      }
      
      반응형
      저작자표시 비영리 변경금지 (새창열림)
      'OnlineJudge' 카테고리의 다른 글
      • 백준 1018 체스판 다시 칠하기 풀이 python, java
      • 백준 10096 세 친구 풀이 python, java
      • 백준 2589 보물섬 풀이 python, java
      • 백준 2217 로프 풀이 python, java
      CODe_
      CODe_
      개발과 관련된 다양한 정보를 몰입감있게 전달합니다.
      최신 글

      티스토리툴바