Day 19 - Interfaces

오늘은 interface라는 것을 다룬 문제인데 사실 interface라는 건 왜 연관지어졌는지 모르겠구 그냥 문제만 풀었다. 이제 보니 추상클래스의 상속하면서 일어나는 method overwrite 다룬 문제 같은데 interface라는 단어를 수업 땐 따로 들어본 적이 없는 것 같아서 다시 찾아봐야겠다.

문제 풀이

문제 해석

Task

  • AdvancedArithmetic 인터페이스와 divisorSum(n)이라는 메서드 선언은 이미 에디터에 있으니 AdvancedArithmetic 인터페이스를 실행시키는 Calculator 클래스를 완성시켜라.
  • divisorSum(n) 메서드는 n의 모든 약수를 더해야 한다.

Input Format

  • 정수 n

Output Format

  • 출력은 해커랭크가 알아서 해주겠다.

문제 풀이

이미 주어진 코드 해석

1
2
3
4
5
6
7
8
9
10
11
12
13
class AdvancedArithmetic(object):
def divisorSum(n):
raise NotImplementedError

class Calculator(AdvancedArithmetic):
def divisorSum(self, n):
pass

n = int(input())
my_calculator = Calculator()
s = my_calculator.divisorSum(n)
print("I implemented: " + type(my_calculator).__bases__[0].__name__)
print(s)
  • 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
    4
    class 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__의 의미를 아는 것이 더 중요한 수확.