새소식

School

2020 1학기 웹파이썬 프로그래밍 기말고사 풀이 답안

  • -
반응형

경희대학교 이성원 교수님

2020년 1학기 웹파 수업 기말고사 풀이 예시 코드입니다

 

채점을 받은 코드는 아니므로

공부할 때 참고용으로 사용하세요

 

지저분한 구문이 많으며

최대한 설명을 자세히 써놨습니다

궁금한 점은 댓글로 달아주시면 답변 드리겠습니다.

 

 

 

"""
https://curihus.tistory.com
본 코드는 2020년 1학기 웹/파이썬 프로그래밍 이성원 교수님 수업
기말고사 시험의 예시 답안입니다.
100% 정답은 아니며 오류가 발견되거나 관련 질문은 블로그 댓글로 남겨주시면
수정 작업 및 답변을 드리겠습니다.
update: 23.05.19
"""

import csv
import copy
class RemoteControl():
    def __init__(self):
        self.nowChannel_index = 0
        self.__enabledChannelList = [] #문제에서 요구한 private 데이터
        self.enabledNumberList= []
        self.nowChannel = []
        self.blockChannelList = []
        self.favorlist = {}
        
    def powerOnRemoteControl(self, channel_list):
        self.__enabledChannelList = channel_list
        self.nowChannel = channel_list[0]
        for i in range(len(channel_list)):
            self.enabledNumberList.append(channel_list[i][0])
            self.favorlist.update({channel_list[i][0]:0})
        return len(channel_list)

    def gotoChannel(self, asked_number):
        if asked_number in self.enabledNumberList:
            self.nowChannel_index = self.enabledNumberList.index(asked_number)
            self.nowChannel = self.__enabledChannelList[self.nowChannel_index]
            return self.nowChannel[1]
        else:
            return self.nowChannel[1]

    def nextChannel(self):
        self.nowChannel_index += 1
        if len(self.__enabledChannelList) == self.nowChannel_index: #현재 채널 index가 마지막이면 0번째 index로 이동하기 위한 if문
            self.nowChannel_index = 0
            self.nowChannel = self.__enabledChannelList[0]
        else:
            self.nowChannel = self.__enabledChannelList[self.nowChannel_index]
        return self.nowChannel[1]

    def previousChannel(self):
        self.nowChannel_index -= 1
        if self.nowChannel_index == -1: # 현재 채널 index가 처음이라면 가장 뒤 index로 이동하기 위한 if문
            self.nowChannel_index = (len(self.__enabledChannelList)-1)
            self.nowChannel = self.__enabledChannelList[self.nowChannel_index]
        else: # 평범한 상황
            self.nowChannel = self.__enabledChannelList[self.nowChannel_index]

        return self.nowChannel[1]

    def blockChannel(self):
        self.blockChannelList.append(self.nowChannel)
        self.__enabledChannelList.remove(self.nowChannel)
        self.enabledNumberList.remove(self.nowChannel[0])
        if self.nowChannel_index == len(self.__enabledChannelList): #index 마지막
            self.nowChannel_index = 0
            self.nowChannel = self.__enabledChannelList[0]

        else: # index 마지막 아닌 경우 큰 변화 없음.
            self.nowChannel = self.__enabledChannelList[self.nowChannel_index]

        return self.nowChannel[1]


    def unblockChannel(self, unblock_number):
        for i in range(len(self.blockChannelList)):
            if unblock_number == self.blockChannelList[i][0]: # 찾았다
                self.unblock = self.blockChannelList[i]
                self.blockChannelList.remove(self.unblock)
                self.__enabledChannelList.append(self.unblock)
                self.__enabledChannelList.sort()
                self.enabledNumberList.append(self.unblock[0])
                self.enabledNumberList.sort()
                self.nowChannel_index = self.__enabledChannelList.index(self.nowChannel)
                return 1
            else:
                continue
        return -1

    def powerOffRemoteControl(self):
        with open('output.csv', 'w', newline='') as fileWrite: #Windows에서는 newline 구문이 없으면 두 줄씩 띄워짐
            myWriter = csv.writer(fileWrite)
            for i in range(len(self.__enabledChannelList)):
                myWriter.writerow(self.__enabledChannelList[i])

    def favorChannel(self):
        try:
            self.favor = self.favorlist[self.nowChannel[0]]+1
            self.favorlist.update({self.nowChannel[0]:self.favor})
            return 1
        except:
            return -1

    def aiNextChannel(self):
        self.favor_noblock = copy.deepcopy(self.favorlist)
        for i in range(len(self.blockChannelList)):
            self.favor_noblock.__delitem__(self.blockChannelList[i][0])
        # noblock= dict / block된 채널을 거른 dict
        # favorlist는 block+unblock 채널이 모두 있어서 추가적인 dict 필요
        # dict의 경우 copy 모듈의 deepcopy를 활용해야 복사가 가능함(list의 경우 .copy()로 가능)

        self.favor = self.favor_noblock[self.nowChannel[0]] # 선호도(value)
        self.favor_list = list(self.favor_noblock.values()) #favorlist = dict 타입, favor_list: list타입(선호도 순위를 알기 위한 list)
        self.favor_list_sort = sorted(self.favor_list).copy() # favor_list_sort : 선호도를 오름차순으로 정렬
        self.favor_list_reverse = sorted(self.favor_list, reverse=True).copy() #favor_list_reverse : 선호도를 내림차순으로 정렬
        self.favor_list_name = self.favor_noblock.keys() #채널 번호 목록(noblock 기준)
        self.favor_noblock_list = list(self.favor_noblock) # noblock상태인 채널번호 리스트

        # aiNextChannel 메소드는 선호도가 한 단계 낮은 채널로 이동.
        
        if self.favor == self.favor_list_sort[0]: #현재 채널 선호도가 제일 작은 값이라면 선호도가 제일 큰 채널로.
            for i in range(len(self.__enabledChannelList)):
                if self.__enabledChannelList[i][0] == self.favor_noblock_list[self.favor_list.index(self.favor_list_reverse[0])]: # 채널번호.
                    self.nowChannel_index = i
                    self.nowChannel = self.__enabledChannelList[i]
                    return self.nowChannel[0]
                else:
                    continue
        else: #현재 채널 선호도보다 작은 채널이 최소 1개는 존재.
            for i in range(self.favor_list_reverse.index(self.favor)+1, len(self.favor_list_reverse)):
                if self.favor_list_reverse[i] == self.favor: #선호도 등급이 같은 경우
                    continue
                else: #선호도 등급이 한단계 낮은 채널 찾았다.
                    self.favor = self.favor_list_reverse[i]
                    self.number = self.favor_noblock_list[self.favor_list.index(self.favor)] #바꿀 채널 번호
                    
                    for j in range(len(self.__enabledChannelList)):
                        if self.number == self.__enabledChannelList[j][0]: #이제 현재 활성화된 채널의 바꿀 채널 번호 index를 찾음
                            self.nowChannel_index = j
                            self.nowChannel = self.__enabledChannelList[j]
                            return self.nowChannel[0]
                        else:
                            continue

    def aiPreviousChannel(self):
        self.favor_noblock = copy.deepcopy(self.favorlist)
        for i in range(len(self.blockChannelList)):
            self.favor_noblock.__delitem__(self.blockChannelList[i][0])
        # noblock= dict / block된 채널 거름.

        self.favor = self.favor_noblock[self.nowChannel[0]] # 선호도(value)
        self.favor_list = list(self.favor_noblock.values()) #favorlist = dict 타입, favor_list: list타입
        self.favor_list_sort = sorted(self.favor_list).copy()
        self.favor_list_reverse = sorted(self.favor_list, reverse=True).copy()
        self.favor_list_items = self.favor_noblock.items()
        self.favor_noblock_list = list(self.favor_noblock) # noblock상태인 채널번호 리스트
        


        if self.favor == self.favor_list_reverse[0]: #현재 채널 선호도가 제일 큰 값이라면
            for i in range(len(self.__enabledChannelList)):
                if self.__enabledChannelList[i][0] == self.favor_noblock_list[self.favor_list.index(self.favor_list_sort[0])]: # 채널번호.
                    self.nowChannel_index = i
                    self.nowChannel = self.__enabledChannelList[i]
                    return self.nowChannel[0]
                else:
                    continue
        else: #현재 채널 선호도보다 큰 채널이 최소 1개 존재
            for i in range(self.favor_list_sort.index(self.favor), len(self.favor_list_sort)):
                if self.favor_list_sort[i] == self.favor: #선호도 등급이 같은 경우
                    continue
                else: #선호도 등급이 한단계 높은 채널 찾았다.
                    self.favor = self.favor_list_sort[i]
                    self.number = self.favor_noblock_list[self.favor_list.index(self.favor)] #바꿀 채널 번호
                    
                    for j in range(len(self.__enabledChannelList)):
                        if self.number == self.__enabledChannelList[j][0]: #찾았다.
                            self.nowChannel_index = j
                            self.nowChannel = self.__enabledChannelList[j]
                            return self.nowChannel[0]
                        else: #못찾은경우 다시.
                            continue

 

23.05.19

favorChannel 멤버 메소드 실행을 하지 않은 채널은

aiNextChannel 멤버 메소드 실행할 때 에러 발생해서 해당 오류 수정

수정 전 코드
수정 이후 코드

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.