이번에는 클래스의 상속에 대한 문제를 풀어보도록 하자. 오늘도 30 Days of Code 의 한 문제.
문제 해석
Task
- 상위 클래스인
Person
의 완성된 코드와, 하위 클래스인Student
의 클래스 선언까지는 주어진다. 상속을 이용해서Student
가 다음의 작업을 수행하도록 코드를 완성시켜라.
Student
에서 생성자는 4개의 매개변수를 받는다:firstName #str
,lastName #str
,idNumber #int
,scores #array-of-int
calculate()
라는 메소드는 Student 객체의 점수평균을 내서 상응하는 알파벳 문자를 리턴한다.
Input Format
- 에디터에 이미 제공된 코드를 통해 Student 클래스 생성자에 필요한 인자들은 다 넣어주고,
calculate
메소드도 (별도 인자 없이) 호출할 것이다.. - 첫 번째 줄은 firstName, lastName, idNumber이 공백으로 구분되어 입력된다.
- 두 번째 줄은 test scores의 개수를 나타내며, 세 번째 줄은 공백으로 구분된 점수들의 나열이다.
문제 풀이
HackerRank에 기본세팅 되어 이미 주어진 코드는 다음과 같다.
Person
클래스 정의1
2
3
4
5
6
7
8class Person:
def __init__(self, firstName, lastName, idNumber):
self.firstName = firstName
self.lastName = lastName
self.idNumber = idNumber
def printPerson(self):
print("Name:", self.lastName + ",", self.firstName)
print("ID:", self.idNumber)- 친절하게 완성된 상위클래스에는 인자로 들어온 세 개의 정보를 class 내의 instance variable에 담아주는 생성자와, 이를 이름과 id번호로 출력하게끔 하는
printPerson
이라는 메소드가 정의되어 있다.
- 친절하게 완성된 상위클래스에는 인자로 들어온 세 개의 정보를 class 내의 instance variable에 담아주는 생성자와, 이를 이름과 id번호로 출력하게끔 하는
- input과 실행명령들
1
2
3
4
5
6
7
8
9line = input().split()
firstName = line[0]
lastName = line[1]
idNum = line[2]
numScores = int(input()) # not needed for Python
scores = list( map(int, input().split()) )
s = Student(firstName, lastName, idNum, scores)
s.printPerson()
print("Grade:", s.calculate())- 첫번째 줄에서 주어진 이름, 성, id번호를
split
으로 공백 기준으로 나눈 리스트가 line이라는 변수에 담겼다. - line 안에 있는 요소들이 각 변수이름으로 할당되었다.
- 두 번째 줄, 즉 점수의 개수가 numScores 라는 변수에 정수형으로 type casting되어 담겼다. #not needed for Python은 무슨 말인지 모르겠다.
- 세 번째 줄, 공백으로 구분된 시험점수가
split
으로 갈라지고,map
함수를 통해 정수로 모든 요소들이 각각 type casting되었고, 그 결과물도 list형으로 type casting되어 scores라는 변수에 담겼다. - 드디어 s라는 객체가
Student
클래스로 생겨났고, 메소드인printPerson()
을 수행하게 되었다. - Task output에서 요구하는 Grade 관련 출력에 대해서는 마지막 줄에
print
로 grade는 따로 있는 걸 보니,printPerson()
메소드는 이름과 id번호만 출력하는, 상위클래스에서 상속받은 그대로 사용하면 된다.
- 첫번째 줄에서 주어진 이름, 성, id번호를
먼저 생성자를 상속받고 필요한 건 더 넣자.
- 하위 class 선언할 때 소괄호 안에 상위클래스명을 넣어주고, 상위 클래스의
__init__
을 넣어준다. - initializer의 parameter에는 상위클래스의 parameter과 동일하게 넣어주거나 추가되는 parameter이 있다면 뒤에 덧붙인다.
- 하위클래스에서 우리는 scores라는 게 추가되므로 이것만 instance variable로 따로 할당해준다.
1
2
3
4class Student(Person):
def __init__(self, firstName, lastName, idNumber, scores):
Person.__init__(self, firstName, lastName, idNumber)
self.scores = scores
- 하위클래스에서 우리는 scores라는 게 추가되므로 이것만 instance variable로 따로 할당해준다.
calculate
함수를 만들어준다.
- scores의 안에 있는 numScores개의 점수들의 평균을 내고, 그 결과값에 따라 알파벳 문자를 return해줘야 한다.
- 평균을 내기 위해 점수를 더해 numScores로 나누어 그 결과를 aver_scores라는 변수에 할당. 처음엔 for문으로 변수에다가 더해 넣었는데 생각해보니 굳이 그럴 필요 없는 것 같아서
sum
함수로 변경했다. - if문으로 aver_scores에 해당하는 문자로 return.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Student(Person):
def calculate(self):
aver_scores = sum(self.scores)/numScores
if aver_scores < 40:
return 'T'
elif aver_scores < 55:
return 'D'
elif aver_scores < 70:
return 'P'
elif aver_scores < 80:
return 'A'
elif aver_scores < 90:
return 'E'
else:
return 'O'
- 평균을 내기 위해 점수를 더해 numScores로 나누어 그 결과를 aver_scores라는 변수에 할당. 처음엔 for문으로 변수에다가 더해 넣었는데 생각해보니 굳이 그럴 필요 없는 것 같아서
느낀 점
생성자를 상속받아 만드는 것을 익힐 수 있었다.
if문이 너무 여러개라서 뭔가 줄여보고 싶은데 잘 모르겠다.
lambda 모듈을 소환해서 reduce
를 쓰는 것도 생각해봤는데 어차피 numScores값도 주어졌으니 sum이 훨씬 간편할 것 같다.