12 Greedy Algorithm
[Python] 클래스 기초 복습
- 클래스는 C++, Java 등의 객체지향언어의 핵심 개념임.
- 클래스는 C의 구조체(struct)와 관련 함수로 묶어 놓은 사용자가 정의할 수 있는 타입
- 클래스(class) = 틀(template) = 멤버 변수들 + 함수들
- 인스턴스(instance) = 틀에서 찍어 나온 실제 변수(variable)
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!
- 위 코드는
point
라는 클래스를 정의한 것. point
는 점을 표현하기 때문에, x-좌표와 y-좌표를 위한 변수 x, y가 멤버로 존재해야 함.- 함수
__init__(self, x, y)
: C++에서의 생성자 역할 (멤버 선언 + 초기화 목적) init
이름 앞과 뒤에underscore _
2개를 사용해 감싼 형태- 클래스의 함수의 첫 매개변수는 항상
self
임.self
는 이 클래스의 인스턴스 자체를 의미함 - 선언된 클래스의 변수(인스턴스)는
변수_이름 = 클래스_이름(매개변수)
형식으로 생성함 p1 = point(3, 2)
는p1
변수를class point
타입의 변수로 선언하고x = 3, y = 2
값으로 멤버x, y
를 각각 초기화 함. (self
는 매개변수로 보내지 않음에 주의!)- 원점과의 거리를 계산하는
dist
멤버 함수를 아래와 같이 추가해보자.
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!
- 원점
(0, 0)
에서 점p1
까지 거리를 계산하고 싶다면,변수.멤버함수
형식으로 호출하면 됨. p1.dist()
형식으로 호출하면dist
함수에p1
이self
로 전달된다.- 이제 두 점 사이의 거리를 계산하는
dist2
멤버함수를 작성해보자. - 이 경우엔
self
매개변수 이외에 두 번째 점을 매개변수로 받아야 함.
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!
- 두 번째 점
p2
를 생성하고,p1
과의 거리를 계산하기 위해,p1.dist2(p2)
또는p2.dist2(p1)
으로 호출하면 됨. p1.dist2(p2)
라면,p1
이self
,p2
가q
로 전달됨.- 이제 점의 두 좌표를 print하려면 어떻게 해야 할까?
- 쉬운 방법은 두 좌표를 출력하는 용도의 멤버 함수를 선언하는 것이다.
- python에서는
__repr__()
내장 함수를 이용해 간단하게 처리할 수 있다. repr(object)
:object
를 공식(official)string
형식으로 변환해주는 함수.- 만약,
repr(p1)
을 하면 어떻게 될까? p1
이point
타입으로 python이 아닌 우리가 정의한 타입이므로repr(p1)
의 처리 과정을 우리가 함수로 정의해줘야 한다.repr(p1)
이 호출되면,point class
에__repr__
멤버 함수를 대신 호출한다.- 그래서
__repr(self)__
멤버 함수에point
정보를string
으로 표현해 리턴하는 부분을 작성해주면 된다. - 아래 코드 참조
- "({0:.3f}, {1:.3f})".format(self.x, self.y)에서
{0:.3f}
라는 뜻은format
의 0번째 매개변수를 실수(f
) 형식으로 소수점 아래 3자리만 출력하라는 의미임.
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!
- 이제
n
개의 점들을 입력받아 list에 저장해보자.
n
을 먼저 입력받는다. (점의 갯수)n
개 점에 대한x
좌표 정수 값,y
좌표 정수 값을 다음n
줄에 걸쳐 입력받는다.- 이 점들을
y
-좌표 값 순서대로 정렬해보자. - 정렬 함수를 직접 만들어 호출하는 방법: quick, merge, heap 정렬 함수를 만들어 리스트를 전달해 정렬
- Python에서 제공하는 정렬함수를 호출하는 방법: sort( )를 이용해 정렬
sort(key = func)
형식으로 호출 가능.func
은 리스트의 각 아이템을 매개변수로 받고, 비교할key
값을 리턴해야 함.- 예를 들어, 점의
y
-좌표 값을key
값으로 정렬하고 싶다면,func
은y
-좌표 값을 리턴하면 됨 - 아래 예제 참조!
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!
- 정렬을 더 간단하게 하는 방법은
lambda
함수 기능을 사용하는 것이다.lambda
함수란 한 줄짜리 함수를 의미한다.
>>> def sum(x,y): ... return x + y ... >>> sum(3,4) 7 >>>
sum
함수와 완전히 같은 결과를 주는lambda
함수는 아래와 같다.- 형식:
lambda parameters: expression
>>> sum = lambda x, y : x + y >>> sum(3,4) 7 >>>
- 이 기능을 이용해 아래와 같이 정렬함수를 호출할 수 있다.
잠금 영역
실행 언어: py3실행 결과를 확인해보세요!