파이썬 백준 알고리즘 - 1002 '터렛'

Posted on May 8, 2018
티스토리로 블로그 이사중입니다.
http://kminito.tistory.com/ ×

백준 온라인 저지 1002번 ‘터렛’
파이썬 알고리즘 문제풀이

문제

이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.

조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 구성되어있다.

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

출력

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

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import math

# 함수로 한번 만들어 보았다.
def find_num(N):
    x1, y1, r1, x2, y2, r2 = map(int,N.split(' '))

    distance = math.sqrt((x1-x2)**2 + (y1-y2)**2)
    r_sum = r1+r2

    # A, B의 좌표가 같은 경우
    # 반지름이 같으면 -1, 반지름이 다르면 0
    if distance == 0:
        if r1 == r2:
            print(-1)
        else:
            print(0)

    # A, B의 좌표가 다른 경우
    else:
        # A, B의 거리가 두 반지름의 합보다 크면 접점이 없다 0
        if distance > r_sum:
            print(0)
        # A, B의 거리가 두 반지름의 합과 같으면 한 점에서 만난다 1
        elif distance == r_sum:
            print(1)

        # A, B의 거리가 두 반지름의 합보다 작은 경우
        # 한 원 안에서 접하는 경우 1
        # 원 안에 들어가서 접점이 없는 경우 0
        # 이외의 경우에는 두 점에서 만남 2
        elif distance < r_sum:
            if (distance+min(r1,r2)) == max(r1,r2):
                print(1)
            elif(distance+min(r1,r2)) < max(r1,r2):
                print(0)
            else:
                print(2)

trials = int(input())
input_data = []

for i in range(trials):
    N = input()
    find_num(N)

배운 것

오늘 배운 map의 사용이 조금 손에 익었다. 특별한 것은 없었다.

코멘트

이 문제는 어제 밤에 잠시 하다가 실패했는데, 오늘 다시 해보니 빼먹은 것들이 떠올라서 풀 수 있었다. 뭐랄까 수학 문제 푸는 것 같은 기분이다. 알고리즘이라는 게 정말 수학이라서 그런 건지, 아니면 내가 무언가 방향이 잘못 되어서 프로그래밍 문제를 수학 문제처럼 느끼는 건지 잘 모르겠다. 아무튼 알고리즘 문제라는 게 풀면 풀수록 코드를 짜는 게 익숙해지도록 해서 뭔가 나름의 발전은 있는 것 같다. 위에서 언급한 것 처럼 새로 배운 것이 손에 익도록 해준다거나, 혹은 코드를 조금 더 깔끔하게 작성할 수 있도록 해 준다거나.

그리고 개인적으로 너무 간단하지 않은 이런 문제들을 블로그에 올리는 것 자체가 스스로에게 큰 공부가 되는 것 같다. 혼자 풀고 치웠으면 하지 않았을 주석달기라던가, 변수의 이름을 조금이라도 더 직관적으로 설정하는 것이나 뭐..

회사에서 하는 일을 이렇게 남이 알아볼 수 있도록 한다는 마음가짐으로 한다면 내 수첩이나 실험 데이터 정리한 게 훨씬 보기 좋을 것 같다는 생각이 든다. 회사 일은 까먹을 걸 알면서도 적지 않는데, 코드를 작성하는 건 블로그에 올리고 싶다는 마음이 드니까 실패한 것들이나 혹은 중간에 검색해서 새롭게 배운 것들도 잘 챙겨놓게 되는 듯.