오늘은 interface라는 것을 다룬 문제인데 사실 interface라는 건 왜 연관지어졌는지 모르겠구 그냥 문제만 풀었다. 이제 보니 추상클래스의 상속하면서 일어나는 method overwrite 다룬 문제 같은데 interface라는 단어를 수업 땐 따로 들어본 적이 없는 것 같아서 다시 찾아봐야겠다.
문제 풀이
문제 해석
Task
AdvancedArithmetic
인터페이스와divisorSum(n)
이라는 메서드 선언은 이미 에디터에 있으니AdvancedArithmetic
인터페이스를 실행시키는Calculator
클래스를 완성시켜라.divisorSum(n)
메서드는 n의 모든 약수를 더해야 한다.
Input Format
- 정수 n
Output Format
- 출력은 해커랭크가 알아서 해주겠다.
문제 풀이
이미 주어진 코드 해석
1 | class AdvancedArithmetic(object): |
AdvancedArithmetic
이라는 클래스를 상속받은Calculator
에서divisorSum
메서드에 지금은pass
가 되어있는데 이 부분을 내가 작성해야 하는군.- 인풋으로 들어간 n는 정수로 바뀐 후
my_calculator
라는 클래스로 만든 객체에서 실행되는 메서드에 인수로 들어간다. - 자기들이 알아서 원하는 바를 출력해가니까 맨 뒷부분은 신경 안써도 되지만, interface라는 개념을 이해시키려고 일부러 출력문을 장황하게 만든 듯 하다.
my_calculator
라는 메서드를 지닌 클래스보다 더 상위클래스 이름이 출력된다.
코드 작성하기
- n의 약수는 n을 나눈 나머지값이 0인 수니까, 1부터 n까지 for문을 돌리며 누계한다.
- 누계는 마지막에 sum 메서드로 하고, filter와 람다함수를 이번엔 활용해보았다.
- filter의 첫 인수로는
lambda x : x % n == 0
를, 두번째 인수로는range(1, n+1)
로 1부터 n까지의 정수에 대해 필터링 작업을 수행한다. - filter된 객체를 list로 타입변환한 후
divisorList
로 이름한 변수에 할당하고 이를 sum으로 다 더하게끔 한 후 반환한다.1
2
3
4class Calculator(AdvancedArithmetic):
def divisorSum(self, n):
divisorList = list(filter(lambda x:n%x==0, range(1,n+1)))
return sum(divisorList)느낀 점
- 문제 풀기보다는 interface라는 것과
type(my_calculator).__bases__[0].__name__
의 의미를 아는 것이 더 중요한 수확.