CH 14 MySelfClass & MyRecordClass

Huisu·2021년 12월 4일
0

Python

목록 보기
14/17
post-thumbnail

Read Me

MySelfClass

  • Class 이름: MySelfClass
    • Default constructor를 지원해야 함 (사용자가 별도로 입력 파라메타를 주지 않는 생성자)
  • Member method (or function) 1: getStudentID( )
    • 입력 파라메타: 없음
    • Return 값: 본인 학번(10자리)의 문자열 하나 (10자리 보다 작으면, 끝에 ‘0’으로 채움)
  • Member method 2: getBirthday( )
    • 입력 파라메타: 없음
    • Return 값: 본인이 태어난 년도(4자리) + 월(2자리) + 일(2자리)의 문자열 하나
    • 예를 들어, 2001년 2월 3일은 “20010203” 임
    • 학교의 인포21(혹은 Portal) 시스템에 등록된 생년월일 이여야 함
  • Member method 3: getStudentIDByInteger( )
    • 입력 파라메타: 없음
    • Return 값: 본인의 학번(10자리)을 정수로 바꾼 숫자 하나
  • Member method 4: getBirthdayByIntegerSum( )
    • 입력 파라메타: 없음
    • Return 값: 정수 하나
    • getBirthday()의 return 값에서, 각 자리 글자를 정수로 환산 후, 모든 정수를 더한 값인 정수 하나
    • 예를 들어, getBirthday()의 return 값이 “20010203”이면, return 값은 정수 8임
  • Member method 5: getMaxInteger( )
    • 입력 파라메타: 없음
    • Return 값: 정수 하나
    • getStudentID( )와 getBirthday( )의 return 값으로 받은, 두개의 문자열에 속한 글자들을 각각 정수로 변환 했을 때, 가장 큰 수인 글자를 정수로 바꾼 숫자 하나
    • 예를 들어, getBirthday()의 return 값이 “20010203”이고, getStudentID()의 return 값이 “9900000029”이면, 이 method의 return 값은 문자 ‘9’를 정수로 바꾼 9임
  • Member method 6: getAverageInteger( )
    • 입력 파라메타: 없음
    • Return 값: 실수 하나
    • getStudentID( )와 getBirthday( )의 return 값으로 받은, 두개의 문자열에 속한 글자들을 각각 실수로 변환한 후, 모든 실수를 더한 값의 평균 값인 실수 하나
    • 예를 들어, getBirthday()의 return 값이 “20010203”이고, getStudentID()의 return 값이 “9900000029”이면, return 값은 실수 2.0555555… 임
  • Member method 7: getBirthdayByMonth( )
    • 입력 파라메타: 없음
    • Return 값: 본인이 태어난 월에 해당하는 문자열 하나
    • getBirthday( )의 return 값 중 ‘월’에 해당하는 값에 대해서, 다음 중 하나여야 함: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
    • 예를 들어, 2001년 2월 3일은 “FEB” 문자열 임

MyRecordClass

  • Member method (or function) 1: makeRecord()

    • 입력 파라메타: 담당 학생 학번, 종료 기한 (Deadline), 수행 항목 번호, 우선 순위
      • 담당 학생 학번: 문자열 (문제 1 과 동일하게 10 자리)
      • 종료 기한: 문자열, 년월일을 나타내는 8 글자 (예: 20200718), 편의상 모든 월은 31 일임
      • 수행 항목 번호: 문자열, 알파벳과 숫자로 이루어진 4 글자 (예: A001)
      • 우선 순위: 1, 2, 3 중 하나
    • Return 값: 다음 중 하나임
      • List: 입력 값(입력 파라메타)로 받은 정보에 에러가 없는 경우, 입력 값을 순서대로 저장하여 만들어진, [“9900000029”, “20210718”, “A001”, 1] 형태의 리스트
      • -1: 정수, 입력 값이 정해진 데이타 타입(문자열, 정수 등)이 아닌 경우
      • -2: 정수, 입력 값이 정해진 형태(10 자리, 8 자리, 4 자리 및 1~3 의 정수)가 아닌 경우
    • makeRecord()의 입력 값으로 받은 정보에 에러가 없는 경우, 객체는 모두 입력 받은 Record 정보를 저장하고 있어야 함
    • 입력 값들의 데이타 타입이 잘못 되었으면, 형태에 대한 조건 검사 없이 -1 을 return 함
  • Member method 2: checkDelay()

    • 입력 파라메타: 수행 항목 번호, 오늘 날자
      • 수행 항목 번호: makeRecord()의 수행 항목 번호와 동일 타입
      • 오늘 날자: makeRecord()의 종료 기한과 동일 타입
      • 수행 항목 번호: 문자열, 알파벳과 숫자로 이루어진 4 글자 (예: A001)
    • Return 값: 다음 중 하나임
      • True: Boolean, 수행 항목 번호에 해당하는 Record 의 종료 기한이, 오늘 이전인 경우 (과거)
      • False: Boolean, 수행 항목 번호에 해당하는 Record 의 종료 기한이, 오늘 혹은 내일 이후인 경우 (현재 & 미래)
      • -1: 정수, 수행 항목 번호에 해당하는 Record 가 없는 경우
  • Member method 3: deferDeadline()

    • 입력 파라메타: 수행 항목 번호, 종료 기한 연장 날자
      • 수행 항목 번호: makeRecord()의 수행 항목 번호와 동일 타입
      • 종료 기한 연장 날짜: 정수, Deadline 을 연장할 날자(day)의 갯수
    • Return 값: 다음 중 하나임
      • List: 수행 항목 번호에 대응하는 Record 의 종료 기한을 연장한 List. 예를 들어, [“9900000029”, “20210718”, “A001”, 1]의 항목에 7 일을 연장하면, [“9900000029”, “20210725”, “A001”, 1]임
      • -1: 정수, 수행 항목 번호에 해당하는 Record 가 없는 경우
      • -2: 정수, 입력 파라메타 중 연장할 날자가 14 일 보다 큰 경우
    • 한 달은 총 31 일 이므로, 이에 맞춰서 년/월/일이 변경되어야 함

Code

Solution.py

class MySelfClass:
    studentID = 0
    birthday_year = 0
    birthday_month = 0
    birthday_day = 0
    def getStudentID(self):
        if(len(str(self.studentID)) == 10):
            return self.studentID
        else: 
            muptiple = 10 - len(str(self.studentID))
            return self.studentID * (10 ** muptiple)



    def getBirthday(self):
        year = str(self.birthday_year)
        if (self.birthday_month < 10):
            month = "0" + str(self.birthday_month)
        else:
            month = str(self.birthday_month)
        if(self.birthday_day < 10):
            day = "0" + str(self.birthday_day)
        else:
            day = str(self.birthday_day)
        return year + month + day



    def getStudentIDByInteger(self):
        return int(self.getStudentID())



    def getBirthdayByInteger(self):
        return (int(self.getBirthday()))



    def getBirthdayByIntegerSum(self):
        sum = 0
        birthday = self.getBirthday()
        for i in range(len(birthday)):
            num = int(birthday[i])
            sum += num
        return sum


    def getMaxInteger(self):
        studentID = str(self.getStudentID())
        birthday = str(self.getBirthday())
        num_studentID = []
        num_birthday = []
        for i in range(len(studentID)):
            num_studentID.append(int(studentID[i]))
        for i in range(len(birthday)):
            num_birthday.append(int(birthday[i]))
        max_studentID = max(num_studentID)
        max_birthday = max(num_birthday)
        if (max_studentID > max_birthday):
            return max_studentID
        else:
            return max_birthday




    def getAverageInteger(self):
        studentID = str(self.getStudentID())
        birthday = str(self.getBirthday())
        num_studentID = []
        num_birthday = []
        for i in range(len(studentID)):
            num_studentID.append(int(studentID[i]))
        for i in range(len(birthday)):
            num_birthday.append(int(birthday[i]))
        sum_studentID = sum(num_studentID)
        sum_birthday = sum(num_birthday)
        return (sum_studentID + sum_birthday) / (len(num_studentID) + len(num_birthday))
    


    def getBirthdayByMonth(self):
        birthday = str(self.getBirthday())
        month = birthday[4:6]
        if (month == "01"):
            return "JAN"
        elif (month == "02"):
            return "FEB"
        elif (month == "03"):
            return "MAR"
        elif (month == "04"):
            return "APR"
        elif (month == "05"):
            return "MAY"
        elif (month == "06"):
            return "JUN"
        elif (month == "07"):
            return "JUL"
        elif (month == "08"):
            return "AUG"
        elif (month == "09"):
            return "SEP"
        elif (month == "10"):
            return "OCT"
        elif (month == "11"):
            return "NOV"
        elif (month == "12"):
            return "DEC"





class MyRecordClass():
    record = []
    def makeRecord(self, studentID, deadline, number, priority):
        correcttype = ((type(studentID)) == str) and ((type(deadline)) == str) and ((type(number)) == str) and (type(priority) == int)
        if (not correcttype):
            return -1
        length = (len(studentID) == 10) and (len(deadline) == 8) and (len(number) == 4) and (priority in [1, 2, 3])
        if( correcttype and length):
            new_record = [studentID, deadline, number, priority]
            self.record.append(new_record)
        else:
            return -2



    def checkDelay(self, number, today):
        checkday = ""
        for i in range(len(self.record)):
            if (self.record[i][2] == number):
                checkday = self.record[i][1]
        if (checkday == ""):
            return -1

        int_checkday = int(checkday)
        int_today = int(today)

        check_year = int(checkday[:4])
        check_month = int(checkday[4:6])
        check_day = int(checkday[6:])

        if (int_checkday == int_today):
            return False
        else:
            if (check_day == 31):
                check_day = 1
                check_month += 1
                if (check_month == 13):
                    check_month = 1
                    check_year += 1
            else:
                check_day -= 1
            if(check_month < 10):
                check_month_str = "0" + str(check_month)
            else:
                check_month_str = str(check_month)
            if(check_day < 10):
                check_day_str = "0" + str(check_day)
            else:
                check_day_str = str(check_day)
            nextday = str(check_year) + check_month_str + check_day_str
            int_nextday = int(nextday)
            if (int_today == int_nextday):
                return False

        return True



    def deferDeadline(self, number, delaydays):
        delay_record = []
        for i in range(len(self.record)):
            if (self.record[i][2] == number):
                delay_record = self.record[i]
        if (delay_record == []):
            return -1
        if (delaydays > 14):
            return -2
        else:
            original_deadline = delay_record[1]
            original_deadline_year = int(original_deadline[:4])
            original_deadline_month = int(original_deadline[4:6])
            original_deadline_day = int(original_deadline[6:])
            original_deadline_day += delaydays
            if(original_deadline_day > 31):
                original_deadline_day = original_deadline_day -31
                original_deadline_month += 1
                if(original_deadline_month > 12):
                    original_deadline_month = original_deadline_month - 12
                    original_deadline_year += 1
            if (original_deadline_month < 10):
                new_deadline_month = "0" + str(original_deadline_month) 
            else:
                new_deadline_month = str(original_deadline_month)
            if(original_deadline_day < 10):
                new_deadline_day = "0" + str(original_deadline_day)
            else:
                new_deadline_day = str(original_deadline_day)
            new_deadline = str(original_deadline_year) + new_deadline_month + new_deadline_day
            delay_record[1] = new_deadline
            return delay_record

test.py

from solution import *

if __name__ == "__main__":

    ### MySelfClass ###
    myself = MySelfClass()
    print ("### MySefClass ###")
    print()

    # getStudentID 
    print("getStudentID method")
    myself.studentID = 2019
    print(myself.getStudentID())
    myself.studentID = 2019100907
    print(myself.getStudentID())
    print()

    # getBirthday
    print("getBirthday method")
    myself.birthday_year = 2000
    myself.birthday_month = 5
    myself.birthday_day = 2
    print(myself.getBirthday())
    print()

    # getStudentIDByInteger method
    print("getStudentIDByInteger method")
    print(type(myself.getStudentIDByInteger()))
    print()

    # getBirthdayByInteger method
    print("getBirthdayByInteger method")
    print(type(myself.getBirthdayByInteger()))
    print()

    # getBirthdayByIntegerSum method
    print("getBirthdayByIntegerSum method")
    print("Birthday:" ,myself.getBirthday())
    print(myself.getBirthdayByIntegerSum())
    print()

    # getMaxInteger method
    print("getMaxInteger method")
    print("studentID:" ,myself.getStudentID())
    print("Birthday:" ,myself.getBirthday())
    print(myself.getMaxInteger())
    print()

    # getAverageInteger method
    print("getAverageInteger method")
    print("studentID:" ,myself.getStudentID())
    print("Birthday:" ,myself.getBirthday())
    print(myself.getAverageInteger())
    print()

    # getBirthdayByMonth method
    print("getBirthdayByMonth method")
    print("Birthday:" ,myself.getBirthday())
    print(myself.getBirthdayByMonth)
    print()
    print()
    print()



    ### MyRecord Class ###
    myrecord = MyRecordClass()
    print ("### MyRecord Class ###")
    print()

    # makeRecord method
    print("makeRecord method")
    print("try append [2019100907, \"20201231\"', \"A001\", 3]")
    print(myrecord.makeRecord(2019100907, "20201231", "A001", 3))
    print("try append [2019, \"20201231\"', \"A001\", 3]")
    print(myrecord.makeRecord("2019", "20201231", "A001", 3))
    print("try append [\"2019100907\", \"20201231\"', \"A001\", 3]")
    print(myrecord.makeRecord("2019100907", "20201231", "A001", 3))
    print("record:", myrecord.record)
    print()

    # checkDelay method
    print("checkDelay method")
    print("original record")
    print(myrecord.record)
    print("Check Delay number A002 record at 20201230")
    print(myrecord.checkDelay("A002", "20201230"))
    print("Check Delay number A001 record at 20201230")
    print(myrecord.checkDelay("A001", "20201230"))
    print("Check Delay number A001 record at 20201231")
    print(myrecord.checkDelay("A001", "20201231"))
    print("Check Delay number A001 record at 20210101")
    print(myrecord.checkDelay("A001", "20210101"))
    print()

    # deferDeadline method
    print("deferDeadline method")
    print("original record")
    print(myrecord.record)
    print("delay the record with number A002 for 13 days")
    print(myrecord.deferDeadline("A002", 13))
    print("delay the record with number A001 for 15 days")
    print(myrecord.deferDeadline("A001", 15))
    print("delay the record with number A001 for 13 days")
    print(myrecord.deferDeadline("A001", 13))

0개의 댓글