ko ko ko en en en ko ko cs zh ko ko ko ko ko ko ko ko ko ko ko ko en ko es en ko nds ko ko ko ko ko pt ko ko ko ko ko ko ko ja ko ko en ko ko ru ko ko ko ko ja ko en ko ko ko ko ko ko zh ko fa ko ko ko ko ko ko ko ko ko ko es ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko fr ko ko ko ko fr ko ko ko en en ko en zh en en
파이썬 코딩 도장: 37.1 두 점 사이의 거리 구하기
◀ 36.9 심사문제: 다중 상속 사용하기37.2 연습문제: 사각형의 넓이 구하기 ▶︎
클래스 문법을 알아보았으니 이번에는 클래스를 활용하여 2차원 평면에서 위치를 표현한 뒤 두 점 사이의 거리를 구해보겠습니다.
두 점 사이의 거리를 구하기 전에 먼저 클래스로 점을 구현해보겠습니다.
2차원 평면에서 위치를 표현하려면 x와 y값이 필요하겠죠? 다음과 같이 Point2D 클래스를 구현하고 x와 y를 속성으로 넣습니다.
class Point2D:     def __init__(self, x, y):         self.x = x         self.y = y
이제 Point2D 클래스로 점 두 개를 만듭니다.
2차원 평면에서 두 점을 표시해보면 다음과 같은 모양이 됩니다.
▼ 그림 37-1 2차원 평면으로 본 두 점
37.1.2  피타고라스의 정리로 두 점의 거리 구하기
여기서 두 점의 거리를 구하려면 어떻게 해야 할까요? 학교에서 배운 피타고라스의 정리를 이용하면 됩니다.
임의의 직각삼각형에서 빗변을 한 변으로 하는 정사각형의 넓이는 다른 두 변을 각각 한 변으로 하는 정사각형의 넓이의 합과 같다.
a2 + b2 = c2
그럼 점 p1과 p2로 직각삼각형을 그려봅니다.
▼ 그림 37-2 두 점을 이용한 직각삼각형
피타고라스의 정리에 대입하려면 먼저 선 a와 b의 길이를 구해야 합니다. 우리는 Point2D 클래스의 인스턴스에 두 점의 좌표 정보가 들어있으므로 인스턴스(변수)를 활용하면 됩니다.
a = p2.x - p1.x    # 선 a의 길이 b = p2.y - p1.y    # 선 b의 길이
a는 p2의 x에서 p1의 x를 빼면 되고, b는 p2의 y에서 p1의 y를 빼면 됩니다.
그다음에 피타고라스의 정리에서 c의 길이를 계산하려면 제곱근을 구해야 합니다.
그럼 √(루트)는 어떻게 구현해야 할까요? 이때는 math 모듈의 sqrt 함수를 사용하면 편리합니다. sqrt는 제곱근을 뜻하는 square root에서 따왔습니다.
n  제곱근을 반환, 값이 음수이면 에러 발생
이제 sqrt 함수까지 사용해서 p1과 p2의 거리를 구해보겠습니다.
import math   class Point2D:     def __init__(self, x, y):         self.x = x         self.y = y   p1 = Point2D(x=30, y=20)    # 점1 p2 = Point2D(x=60, y=50)    # 점2   a = p2.x - p1.x    # 선 a의 길이 b = p2.y - p1.y    # 선 b의 길이   c = math.sqrt((a * a) + (b * b))    # (a * a) + (b * b)의 제곱근을 구함 print(c)    # 42.42640687119285
이처럼 sqrt 함수에 값을 넣으면 해당 값의 제곱근을 구해줍니다. 여기서는 a의 제곱과 b의 제곱의 합을 (a * a) + (b * b)처럼 표현했는데 거듭제곱(power)을 구하는 pow 함수를 사용해도 됩니다(math 모듈).
n  값을 지수만큼 거듭제곱한 값을 반환
즉, a2를 구하고 싶다면 pow(a, 2)처럼 사용합니다. 앞에서 작성한 코드를 pow 함수로 다시 작성하면 다음과 같은 모양이 되겠죠?
c = math.sqrt(math.pow(a, 2) + math.pow(b, 2))
물론 파이썬의 거듭제곱 연산자 **를 사용해도 됩니다.
c = math.sqrt((a ** 2) + (b ** 2))
만약 선의 위치를 구할 때 p2에서 p1을 빼는 것이 아닌 p1에서 p2를 빼면 어떻게 될까요?
a = p1.x - p2.x    # 선 a의 길이 b = p1.y - p2.y    # 선 b의 길이
30 - 60은 -30이고 20 - 50도 -30입니다. 하지만 걱정하지 않아도 됩니다. a2 + b2 = c2 식에서 a와 b는 같은 값을 두 번 곱하는데 음수(-)끼리 곱하면 항상 양수(+)가 되므로 부호는 상관하지 않아도 됩니다. 즉, 양수(+) * 양수(+) 또는 음수(-) * 음수(-) 상황밖에 없기 때문이죠.
지금까지 클래스를 사용하여 점을 표현하고 두 점 사이의 거리를 구하는 방법을 배웠는데 피타고라스의 정리를 수학 함수로 푸는 부분이 약간 어려웠습니다. 당장 이해가 되지 않는다면 일단 넘어가도 상관없습니다. 나중에 두 점 사이의 거리를 구해야 할 때 다시 돌아와서 찾아보세요.
참고 | 절댓값 함수
내장 함수 abs 또는 math 모듈의 fabs 함수를 사용하면 양수 또는 음수를 절댓값(absolute value)으로 만들 수 있습니다.
정수는 절댓값을 정수로 반환, 실수는 절댓값을 실수로 반환
참고 | namedtuple 사용하기
파이썬에서는 각 요소에 이름을 지정해 줄 수 있는 튜플인 namedtuple을 제공합니다( collections 모듈). namedtuple은 자료형 이름과 요소의 이름을 지정하면 클래스를 생성해줍니다. 여기서 자료형 이름은 문자열, 요소의 이름은 문자열 리스트로 넣어줍니다.
클래스 = collections.namedtuple('자료형이름', ['요소이름1', '요소이름2'])
namedtuple로 생성한 클래스는 값을 넣어서 인스턴스를 만들 수 있으며 인스턴스.요소이름 또는 인스턴스[인덱스] 형식으로 요소에 접근할 수 있습니다.
인스턴스 = 클래스(값1, 값2)
인스턴스 = 클래스(요소이름1=값1, 요소이름2=값2)
다음은 namedtuple을 사용하여 점을 표현한 뒤 두 점의 거리를 구합니다.
import math import collections   Point2D = collections.namedtuple('Point2D', ['x', 'y'])    # namedtuple로 점 표현   p1 = Point2D(x=30, y=20)    # 점1 p2 = Point2D(x=60, y=50)    # 점2   a = p1.x - p2.x    # 선 a의 길이 b = p1.y - p2.y    # 선 b의 길이   c = math.sqrt((a * a) + (b * b)) print(c)    # 42.42640687119285
◀ 36.9 심사문제: 다중 상속 사용하기37.2 연습문제: 사각형의 넓이 구하기 ▶︎
Unit 1. 소프트웨어 교육과 파이썬
Unit 2. 파이썬 설치하기
Unit 3. Hello, world!로 시작하기
Unit 4. 기본 문법 알아보기
Unit 5. 숫자 계산하기
Unit 6. 변수와 입력 사용하기
Unit 7. 출력 방법 알아보기
Unit 8. 불과 비교, 논리 연산자 알아보기
Unit 9. 문자열 사용하기
Unit 10. 리스트와 튜플 사용하기
Unit 11. 시퀀스 자료형 활용하기
Unit 12. 딕셔너리 사용하기
Unit 13. if 조건문으로 특정 조건일 때 코드 실행하기
Unit 14. else를 사용하여 두 방향으로 분기하기
Unit 15. elif를 사용하여 여러 방향으로 분기하기
Unit 16. for 반복문으로 Hello, world! 100번 출력하기
Unit 17. while 반복문으로 Hello, world! 100번 출력하기
Unit 18. break, continue로 반복문 제어하기
Unit 19. 계단식으로 별 출력하기
Unit 20. FizzBuzz 문제
Unit 21. 터틀 그래픽스로 그림 그리기
Unit 22. 리스트와 튜플 응용하기
Unit 23. 2차원 리스트 사용하기
Unit 24. 문자열 응용하기
Unit 25. 딕셔너리 응용하기
Unit 26. 세트 사용하기
Unit 27. 파일 사용하기
Unit 28. 회문 판별과 N-gram 만들기
Unit 29. 함수 사용하기
Unit 30. 함수에서 위치 인수와 키워드 인수 사용하기
Unit 31. 함수에서 재귀호출 사용하기
Unit 32. 람다 표현식 사용하기
Unit 33. 클로저 사용하기
Unit 34. 클래스 사용하기
Unit 35. 클래스 속성과 정적, 클래스 메서드 사용하기
Unit 36. 클래스 상속 사용하기
Unit 37. 두 점 사이의 거리 구하기
37.1 두 점 사이의 거리 구하기
37.2 연습문제: 사각형의 넓이 구하기
37.3 심사문제: 두 점 사이의 거리 구하기
Unit 38. 예외 처리 사용하기
Unit 39. 이터레이터 사용하기
Unit 40. 제너레이터 사용하기
Unit 41. 코루틴 사용하기
Unit 42. 데코레이터 사용하기
Unit 43. 정규표현식 사용하기
Unit 44. 모듈과 패키지 사용하기
Unit 45. 모듈과 패키지 만들기
Unit 46. 실전예제: 웹의 데이터로 그래프 그리기
C 언어 코딩 도장
- 이 사이트에 실린 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 (주)도서출판 길벗과 지은이에게 있습니다.
- 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.
- 책의 내용을 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다.
- 링크, SNS 공유는 허용합니다.
서울시 마포구 서교동 월드컵로 10길 56 (서울시 마포구 서교동 467-9)
Copyright © 2016-2021 Coding Dojang