본문 바로가기

코딩/파이썬

파이썬 abs 함수를 알아보자(feat. 백준 1002번 터렛 문제)

반응형

안녕하세요.

오늘은 파이썬의 abs 함수를 알아보겠습니다.

 

백준 1002번 터렛 문제를 푸는데 abs함수가 쓰이더라구요.

abs 함수는 절대값을 구하는 함수입니다.

 

절대값은 다들 아시겠지만 방향을 무시하고 크기만 나타내는 값입니다.

abs 함수를 직접 써볼까요?

print(abs(-1))

위 코드를 실행하면 -1의 크기인 1이 출력됩니다.

 

쉽죠 ? ㅎㅎ

 

백준 1002번 문제에서는 두 중심 좌표 사이의 거리와 두 반지름을 뺀 값을 비교할때 쓰였습니다.

터렛 문제는 두 원의 접점이 몇개인지 구하는 문제거든요.

 

x, y는 두 점의 좌표값이고, r은 반지름의 크기입니다.

그래서 아래와 같은 수식을 이용해 변수 d에 두 점의 거리를 계산해 넣어주었습니다.

    d = ((x1-x2)**2 + (y1-y2)**2)**0.5

참고로 **는 제곱이라는 의미입니다. 직관적이죠?

 

그리고 만약 d값이 0이 아니라면, 두 점이 서로 다른 위치에 있다는 뜻이므로

두 원의 접점 개수를 구하는 조건 식을 넣어주었습니다.

 if d:
        if ((d > (r1+r2)) or (d < abs(r1-r2))):
            print(0)
        elif (d == (r1+r2)) or (d == abs(r1-r2)):
            print(1)
        elif (d < (r1+r2)):
            print(2)

여기서 r1+r2가 d보다 작다면 두 원은 접점이 없다는 의미입니다.

마찬가지로 r1-r2의 절대값이 d보다 크다면 역시 접점이 없다는 의미겠죠?

왜냐하면 접점이 1개라도 있으려면 d+r1=r2거나 d+r2=r1이어야 하기 때문입니다.

 

다음으로 r1+r2가 d와 같다면 두 원의 접점은 1개가 됩니다.

마찬가지로 r1-r2의 절대값이 d와 같을 때도 접점은 1개예요.

 

세번째 조건도 같은 원리입니다.

r1+r2가 d보다 크면 두 원의 접점이 2개가 됩니다.

자 근데 만약 d가 0이라면?

 else:
        if (r1==r2):
            print(-1)
        else:
            print(0)

그럼 r이 같을때 두 원은 완벽하게 겹치게 되므로 접점이 무한대입니다.

r이 다르면 동심원이니 접점이 0개가 되구요.

반응형