import math로 수학모듈을 소환한다. 아마 마지막에 제곱근을 구하는 sqrt() 함수를 써야해서 그런 것 같다.
Complex라는 클래스를 만들도록 뼈대만 구축해주었다. 각각을 살펴보자.
def __init__(self, real, imaginary) : 하단에 실행 코드를 보면 알겠지만 친젏한 HackerRank에서 이미 input을 받아 real과 imaginary 변수로 할당해주었다. 우리는 input의 형태에 신경쓸 필요 없이 복소수의 real part와 imaginary part를 각각 연산에 넣을 수 있도록 바로 instance variable로 할당해주기만 하면 된다.
def __add__(self, no) : 이전에 날 멘붕에 빠뜨렸던 Class 2 - Find the Torsional Angle 문제에서 익힌 매직메소드이다. 명령어로 __add__()를 쓰지 않더라도 +라는 연산자와 뒤에 오는 인자를 대상으로 해당 작업을 수행하게끔 하는 메소드이다. 이런 연산자 활용 매직메소드가 이번 문제에서 대거 출현하였으니 확실히 익히고 갈 수 있겠다.
def __sub__(self, no) : 위와 동일. 연산자가 -라는 것만 유의.
def __mul__(self, no) : 위와 동일. 연산자가 *라는 것만 유의.
def __truediv__(self, no) : 위와 동일하다. 연산자가 /라는 것만 유의.
def mod(self) : 복소수의 절대값을 구하는 것이므로 위의 연산들처럼 두개의 인자가 아닌 자신의 값만 인자로 주어진다.
1 2 3 4 5 6 7 8 9 10 11 12 13
def __str__(self): if self.imaginary == 0: result = "%.2f+0.00i" % (self.real) elif self.real == 0: if self.imaginary >= 0: result = "0.00+%.2fi" % (self.imaginary) else: result = "0.00-%.2fi" % (abs(self.imaginary)) elif self.imaginary > 0: result = "%.2f+%.2fi" % (self.real, self.imaginary) else: result = "%.2f-%.2fi" % (self.real, abs(self.imaginary)) return result
이어 주어지는 매직메소드 __str__()는 instance의 imaginary 값이 0일 경우, real 값이 0일 경우, imaginary 값이 양수일 경우와 음수일 경우로 나누어 복소수 형태를 조정해주고 소수점 뒤 2자리까지 출력해주는 코드임을 알 수 있다.
결국 결과값을 알맞은 복소수 형태로 만들어주는 보정에 대한 메소드인데, 이는 Task에서 연산 외에 요구했던 조건과 동일하다. 친절한 HackerRank가 다 해주었으니 연산 메소드만 만들관서 이 메소드를 return시 사용해주기만 하면 된다.
1 2 3 4 5 6
if __name__ == '__main__': c = map(float, input().split()) d = map(float, input().split()) x = Complex(*c) y = Complex(*d) print(*map(str, [x+y, x-y, x*y, x/y, x.mod(), y.mod()]), sep='\n')
마지막으로 실행 코드가 제공된다. input을 받아 float값으로 다 type casting을 해주고, 이를 Complex 클래스로 객체화 한 후 각 연산을 수행한 결과를 새로 줄바꿈하여 print 해주라는 실행명령이므로, 우리는 연산하는 코드만 제대로 짜서 결과값을 return 해주면 되겠다.
문제 풀이
복소수의 덧셈
복소수의 덧셈은 real은 real끼리, imaginary는 imaginary끼리 더해준 값이기 때문에 상대적으로 간단하다.
no라는 인자 또한 Complex 객체여야만 연산이 가능하므로 이를 대상으로 해당 작업을 해주도록 메소드를 만들어준다.
각 값을 합쳐 real_value와 imaginary_value라는 변수에 넣어주고 이에 __str__() 메소드를 사용한 값을 리턴했다.
이미 마련해준 공식만 있으면 클래스로 연산 만들기는 어렵지 않다. 매직메소드 원없이 써보면서 익혀서 좋다. __str__은 객체를 출력할 때 자동으로 사용된다고 하던데, 이걸 self.__str__으로 입력하지 않고 다른 방법으로 실행하는 방법은 없을까 궁금. 복소수의 연산에 대해서 math 모듈이든 어디든 누군가 이미 만들어둔게 있지는 않았을까 하는 생각도.