파이썬 백준 알고리즘 - 1004 '어린왕자'

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

백준 온라인 저지 1004번 ‘어린 왕자’
파이썬 알고리즘 문제풀이

문제

문제 링크 참조

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주어지며, 세 번째 줄부터 n줄에 걸쳐 행성계의 중점과 반지름 (cx, cy, r)이 주어진다. 입력제한은 다음과 같다. (-1000 ≤ x1, y1, x2, y2, cx, cy ≤ 1000, 1 ≤ r ≤ 1000, 1 ≤ n ≤ 50)

출력

각 테스트 케이스에 대해 어린 왕자가 거쳐야 할 최소의 행성계 진입/이탈 회수를 출력한다.

소스코드

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import math

T = int(input()) # 테스트 개수 입력

for trials in range(T):

    # 도착 및 출발 위치를 받아서 변수에 집어넣음
    x1, y1, x2, y2 = map(int, input().split(' '))

#    아래 내용을 위의 한 줄로 대체함
#    loc = input()
#    loc = loc.split(' ')
#    x1 = int(loc[0])
#    y1 = int(loc[1])
#    x2 = int(loc[2])
#    y2 = int(loc[3])

    n = int(input()) # 행성 개수

    planets = [] # 행성 좌표 및 반지름이 들어갈 리스트

    # 좌표를 입력 받아서 리스트로 만듦
    for i in range(n):
        planets.append(input())

    # shell_1 은 출발지점이 속한 행성의 숫자
    # shell_2 은 도착지점이 속한 행성의 숫자
    # shell_3 은 출발 및 도착 지점이 함께 속한 행성의 숫자

    shell_1 = 0
    shell_2 = 0
    shell_shared = 0

    # 입력 받은 행성들에 대해 루프를 돌림
    for planet in planets:

        planet = planet.split(' ')

        xc = int(planet[0])
        yc = int(planet[1])
        r = int(planet[2])

        d1 = math.sqrt((xc - x1) ** 2 + (yc - y1) ** 2)  # 행성과 출발지점과의 거리
        d2 = math.sqrt((xc - x2) ** 2 + (yc - y2) ** 2)  # 행성과 도착지점과의 거리

        # 행성 중심과 출발/도착 지점과의 거리가 반지름보다 작으면
        # 그 행성에 속한 것으로 구분하여 해당 shell 값에 +1
        if d1<r and d2<r:
            shell_1 += 1
            shell_2 += 1
            shell_shared += 1

        else:
            if d1 < r :
                shell_1 += 1
            if d2 < r :
                shell_2 += 1

    # '출발/도착 지점이 함께 들어있는 있는 행성'에 의한 경계선의 값을 빼고 리턴하도록 함.
    print(shell_1 + shell_2 - shell_shared*2)   

    # 뒤에 *2가 있는 이유는, 한 행성 안에 도착/출발 지점이 모두 들어가 있을 경우
    # shell_1에도 들어가고 shell_2에도 들어갔으니 -2를 해줘야 하기 때문  

배운 것

이번 문제는 딱히 새롭게 배운 것은 없는 것 같다.

코멘트

입력 범위는 고려하지 않고 작성했는데, 사실 입력범위를 어떻게 고려하는지 잘 몰라서 안 했다. 내가 할 수 있는 건 고작해야 변수 범위를 integer로 맞춰 주는 것인데, 그게 맞는 것인지도 잘 모르겠다. 아무튼 생각보다 어렵지 않은 문제였다. 알고리즘보다는 수학의 집합 문제같은.. 그런..

그리고 내가 만든 코드가 출제자의 의도에 맞는 코드인지, 그리고 내 코드가 제대로 작성된 코드인지 자꾸 궁금하다. 저렇게 지저분해 보이는 코드로 변수를 정의한 것에 대해서, 분명히 더 나은 코드가 있을텐데 다른 사람은 어떻게 했는지.. 궁금하다. -> 좌표 입력 부분 코드 수정

아 여기 메모를 하자면 input() 으로 좌표 등을 받으면 보통 공백(space)으로 값이 구분이 되는데, 나는 일일이 인풋에다가 split(' ')한 후에 또 그 리스트의 인덱스를 이용해서 각 변수에 값을 할당했다. 분명히 이거 더 좋은 방법이 있을 것이라고 생각한다. 잊지 말고 찾아봐야지.