BJ1002_터렛_python

Kidon Seo·2021년 4월 16일
0

1. 문제링크

https://www.acmicpc.net/problem/1002

2. 풀이 전 계획과 생각

< 정보 정리 >

1) 입력값: 테스트 케이스 T, A의 좌표와 C로부터의 거리(x1, y1, r1), B의 좌표와 C로부터의 거리(x2, y2, r2)
2) 출력값: 가능 위치 수 N
3) 제약조건:

  • -10,000 <= x1, y1, x2, y2 <= 10,000
  • 0 <= r1, r2 <= 10,000
    4) 예외케이스: 무한대일 경우, -1 출력

< 공통 로직 >

1) A와 B의 거리를 찾는다(distance).
2) distance, r1, r2의 최대값을 구한다(max_dist).
3) distance가 0 이고 r1이 r2가 같을 경우 가능 케이스가 무한대이므로 -1.
4) distance가 r1 + r2 면 가능 케이스 1.
5) max_dist가 distance, r1, r2 중 작은 두 값의 합과 같다면 가능 케이스 1.
6) max_dist가 distance, r1, r2 중 작은 두 값의 합보다 크다면 가능 케이스 0.
7) 그 외의 경우에는 가능 케이스 2.

3. 풀이

def find_locations_from_turret():
  t = int(input("Enter the number of test cases:"))
  result = [];
  for i in range(t):
      x1 = int(input(f"{i + 1} Enter x1: "))
      if x1 > 10000 or x1 < -10000:
        print("x1 must be between -10000 and 10000 inclusive.")
        return
      y1 = int(input(f"{i + 1} Enter y1: "))
      if y1 > 10000 or y1 < -10000:
        print("y2 must be between -10000 and 10000 inclusive.")
        return
      r1 = int(input(f"{i + 1} Enter r1: "))
      if r1 > 10000 or r1 < 1:
        print("r1 must be between 1 and 10000 inclusive.")
        return
      x2 = int(input(f"{i + 1} Enter x2: "))
      if x2 > 10000 or x2 < -10000:
        print("x1 must be between -10000 and 10000 inclusive.")
        return
      y2 = int(input(f"{i + 1} Enter y2: "))
      if y2 > 10000 or y2 < -10000:
        print("y2 must be between -10000 and 10000 inclusive.")
        return
      r2 = int(input(f"{i + 1} Enter r2: "))
      if r2 > 10000 or r2 < 1:
        print("r1 must be between 1 and 10000 inclusive.")
        return
      distance = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** (1 / 2)
      distances = [ distance, r1, r2 ]
      max_dist = max(distances)
      distances.remove(max_dist)
      possible_locations = -1 if (distance == 0 and r1 == r2) else 1 if  (distance == r1 + r2 or max_dist == sum(distances)) else 0 if (max_dist > sum(distances)) else 2
      result.append(possible_locations);
  for i in result:
    print(i)

find_locations_from_turret()

4. 풀이하면서 막혔던 점과 고민

거리에 따른 원의 관계(접점 유무)를 파악하는게 가장 어려웠다.

5. 풀이 후 알게된 개념과 소감

다행히 비쥬얼 적으로 잘 설명된 자료가 있어서 참조하면서 원 개념을 이해할 수 있었다.
코드 측면에서는 if... else 문을 one-liner로 짤 수 있는 방법도 배울 수 있었다.

Credits:

0개의 댓글