관리 메뉴

A seeker after truth

문제4 본문

Algorithm/문제풀이

문제4

dr.meteor 2020. 1. 8. 20:18

사정상 문제 출처는 밝히지 않음.

거의 12시간 가까이 써서 풀었다. 문제 난이도가 어떤지는 모르지만, 실력이 좋았으면 더 빨리 풀었겠지.

대신 완벽하게 정답임. 데이터와 파일을 다룬다는게 이렇게까지 힘들고 어렵고 단순하지 않은 일인지 몰랐는데, 이 문제를 통해 깨달았다.

그래도 시간이 지나면 점점 익숙해지겠지!

 

무엇보다 sorted 함수에서 key = itemgetter(index) 라는 좋은 기능을 알게되었다는 점과,

(파이썬에서 단일/이중 리스트 정렬에 대해 다룬 공식문서 페이지: https://docs.python.org/ko/3/howto/sorting.html)

zip, [~ for ~ in ~], csv 모듈 기능을 이용했다는 점이 기뻤다. 공부한걸 써먹었으니!

# 특이 사항: vscode에서는 실행이 안되고, 피이참에선 아주 잘된다.

-> 해결 방법 찾았음! 비주얼 코드에서 같은 폴더 안에 파일이 있어도 파일을 불러오지 못하는 경우에 대한 댓글 답변:

"혹시 vscode에서 폴더 열기가 아니라 파일 열기로 파일을 여신건가요? 파일열기로 .py파일을 열었을 때 작업공간이랑 파일 위치랑 다른경우가 있는 것 같습니다.(디폴트 위치가 있는 것 같습니다) 파일 열기로 여셨다면 폴더열기로 다시 열어보심이 좋을 것 같아요"

# ANSWER : START
import collections
from operator import itemgetter
import csv


class myFile:
    def __init__(self, filename=None, openmode=None):
        if openmode == 'r':
            self.f = open(filename, 'r')  # self 해야하는...?
            self.contents = self.f.readlines()
            self.memberlist = []
            for line in self.contents[1:]:
                self.memberlist.append(line.strip('\n').split(','))
            # 얘가 정렬된 값이다!
            self.memberlist = sorted(self.memberlist, key=itemgetter(0))
        elif openmode == 'w':
            try:
                self.f = open(filename, 'w')  # fileIOstream
            except:
                raise Exception("Error")

    def getStatus(self):
        return isinstance(self.f, collections.Iterable)

    def getBody(self):  # read 모드 함수에서만 열린다 당연히!
        try:
            return self.memberlist
        except:
            print("Error")
            return False

    def setContentHead(self, firstline=None):
        try:
            self.firstline = firstline
            return True
        except:
            print("error")
            return False

    def setContentBody(self, body=None):
        try:
            self.body = body
            return True
        except:
            print("error")
            return False

    def writeFile(self):
        writer = csv.writer(self.f)
        writer.writerow(self.firstline)
        for i in self.body:
            writer.writerow(i)

    def closeFile(self):
        try:
            self.f.close()
            return True
        except:
            print("Error")
            return False


def mergeList(list1, list2):
    mergedlist = []
    # common ids 모으는 과정
    list1_ids = [list1[j][0] for j in range(len(list1))]
    list2_ids = [list2[j][0] for j in range(len(list2))]
    common_ids = (set(list1_ids)).intersection(set(list2_ids))
    common_ids = list(common_ids)
    for smallist1 in list1:
        if smallist1[0] in common_ids:
            littlelist = []
            littlelist.extend(smallist1)
            mergedlist.append(littlelist)
    i = 0
    for smallist2 in list2:
        if smallist2[0] in common_ids:
            avg = (int(smallist2[1]) + int(smallist2[2]) + int(smallist2[3]))//3
            mergedlist[i].extend(smallist2[1:])
            mergedlist[i].append(avg)
        i += 1
    return mergedlist


# ANSWER : END

file1 = myFile("inputdata1.csv", 'r')
file2 = myFile("inputdata2.csv", 'r')

if (file1.getStatus() != False) and (file2.getStatus() != False):
    newList = mergeList(file1.getBody(), file2.getBody())

    file3 = myFile("output.csv", 'w')
    file3.setContentHead(["ID", "Name", "Course 1", "Course 2", "Course 3", "Average"])
    file3.setContentBody(newList)
    file3.writeFile()
    file3.closeFile()
else:
    print("input file error")

file1.closeFile()
file2.closeFile()

'Algorithm > 문제풀이' 카테고리의 다른 글

프로그래머스 정렬 문제풀이(1)  (0) 2020.01.24
문제5  (0) 2020.01.08
파이썬 수업 문제 분석 3  (0) 2020.01.07
수업 퀴즈 문제 분석 2  (0) 2020.01.02
수업 퀴즈 문제 분석1  (0) 2020.01.02