알고리즘/문제풀이

[BOJ][1002번] - 터렛 (python)

Dibrary 2022. 4. 10. 09:50
반응형

안녕하세요 Dibrary입니다.

이번 문제는 백준알고리즘의 [1002번 - 터렛] 입니다.

 

제가 이 문제를 풀 때 처음에 쓸데없는 방향으로 생각이 빠져버렸었습니다. 

그래서 아주 거지같은 코드가 탄생하기 시작했죠.

 

처음에 접근했던 생각

  1. 원점 위치별로 구분을 해야겠구나,
  2. 해당 구분 하에서 원점간의 거리와 반지름의 거리를 비교해야겠구나,

 

위 생각처럼 풀면 코드가 어떻게 나오냐면요...

이미 조건문만 너무 많죠? 조건문 안에 조건문이 또있고... 근데 또 위 골격에 맞춰서 작성하면 통과가 안 됩니다. 
반례가 있는 것이죠...

 

그래서 생각을 해 보았습니다.

  1. 왜 이렇게 코드가 길어질까
  2. 뭐만 따지면 되는 것인가?

 


핵심은 원의 중심과의 거리, 반지름 만 고려하면 되는 것이었습니다.

처음에 원의 x, y 별로 다른 것을 구별할 필요 자체가 없었던 것이죠. 또한, 원이 외부에서 접하나 내부에서 접하나 닿는 부분이 1개인 것과, 2개인 것은 결국 출력이 같기 때문에 하나의 조건으로 뽑아낼 수 있는 것입니다.

 

조건문 한 계층으로 다 끝나죠?

보면 distance를 구하는 것은 같습니다. 원점 간의 거리는 반드시 구해야죠.

그리고 조건문 코드를 풀이해보면, 

첫 번째 조건문은 중심이 같고, 반지름도 같은 경우를 의미합니다.

두 번째 조건문은 두 원 중심간의 거리와 반지름차가 같거나, 반지름 합이 같은 경우입니다. 즉, 큰 원 내부에 작은 원이 접하거나 큰 원 외부에 작은 원이 접한 경우입니다. 딱 1점만 교점이 있을 것이므로 출력은 1이 나옵니다.

세 번째 조건문은 두 원 중심간의 거리가 반지름차보다 크거나 반지름 합보다 작은 경우입니다. 즉, 큰 원 내부에 작은 원의 일부가 큰 원 밖으로 튀어나온 경우죠, 

 

즉, x축은 같은데 y축이 다르거나, y축이 같은데 x축이 다르거나, x와 y축이 모두 다르거나 이런걸 고려할 필요 없이
중심간의 거리와 반지름만의 연산으로 확인할 수 있다는 것입니다.

728x90
반응형