{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment 5\n",
"### [정보]\n",
"#### 1) Due Date: 2016년 12월 12일 (월요일), 23시 59분\n",
"#### 2) 제출방법: ipython notebook으로 작성된 내용을 github에 올려 해당 URL을 다시 http://nbviewer.ipython.org에 넣어서 산출된 URL을 EL사이트에 제출\n",
"#### 3) 내용: 반드시 python code와 수행 결과를 ipython notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.\n",
"#### 4) 숙제이후 소감: 모든 문제의 답을 적은 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. \n",
"#### 5) 문제 (총 12개)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [1번 문제] \n",
"클래스와 모듈의 공통점과 차이점에 대해 설명하시오."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [2번 문제] \n",
"다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [3번 문제] \n",
"\n",
"다음 각 요구사항 모두를 만족시키는 Counter 클래스를 코딩하시오 (정답을 각 요구사항별로 입력할 필요 없이 3번 문제에 대해 1개의 클래스 정의 코드를 제시하면 된다.)\n",
" - 요구사항 1. 생성자에 count 값과 step 값을 인자로 받을 수 있다.\n",
" - count: Counter 인스턴스가 지니는 초기 정수 값\n",
" - step: Counter 인스턴스의 count가 증가되는 증분 (defalt 값: 1)\n",
"\n",
" > \\>\\>\\> c = Counter(10)
\n",
" > \\>\\>\\> d = Counter(10, 2)
\n",
" \n",
" - 요구사항 2. 다음과 같이 Counter의 인스턴스를 출력을 해주는 \\_\\_str\\_\\_() 메소드를 Counter 클래스 내에 구현하시오.\n",
" > \\>\\>\\> print c
\n",
" > [Count (step: 1)] 10
\n",
" > \\>\\>\\> print d
\n",
" > [Count (step: 2)] 10
\n",
" \n",
" - 요구사항 3. 다음과 같이 step에 주어진 증분만큼 count를 증가시키는 incr() 메소드를 Counter 클래스 내에 구현하시오.\n",
" > \\>\\>\\> c.incr()
\n",
" > \\>\\>\\> d.incr()
\n",
" > \\>\\>\\> print c
\n",
" > [Count (step: 1)] 11
\n",
" > \\>\\>\\> print d
\n",
" > [Count (step: 2)] 12
\n",
" \n",
" - 요구사항 4. Counter 클래스 내에 관련 메소드를 추가하여 인스턴스 객체를 직접 호출(call)할 수 있도록 하시오. 인스턴스 객체를 직접 호출했을 때에 내부적으로 incr() 메소드를 호출하는 방법으로 구현하시오. \n",
" > \\>\\>\\> c()
\n",
" > \\>\\>\\> d()
\n",
" > \\>\\>\\> print c
\n",
" > [Count (step: 1)] 12
\n",
" > \\>\\>\\> print d
\n",
" > [Count (step: 2)] 14
\n",
" \n",
" - 요구사항 5. 다음과 같은 두 개의 산술 연산 (+, -)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n",
" > \\>\\>\\> c = c + 5
\n",
" > \\>\\>\\> d = d - 5
\n",
" > \\>\\>\\> print c
\n",
" > [Count (step: 1)] 17
\n",
" > \\>\\>\\> print d
\n",
" > [Count (step: 2)] 9
\n",
" \n",
" - 요구사항 6. 다음과 같은 관계연산 (>, <, ==)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.\n",
" > \\>\\>\\> print c > 10
\n",
" > True
\n",
" > \\>\\>\\> print d > 10
\n",
" > False
\n",
" > \\>\\>\\> print c < 10
\n",
" > False
\n",
" > \\>\\>\\> print d < 10
\n",
" > True
\n",
" > \\>\\>\\> print c == 17
\n",
" > True
\n",
" > \\>\\>\\> print d != 9
\n",
" > False
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [4번 문제] \n",
"\n",
"다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 \\_\\_init\\_\\_(), \\_\\_str()\\_\\_(), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.\n",
" - MySet은 집합(Set) 자료형을 정의하려는 의도하에 만들어진 클래스이다."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MySet: {1 ,2 ,3}\n",
"MySet: {2 ,3 ,4 ,5 ,6 ,7 ,8 ,9}\n"
]
}
],
"source": [
"class MySet(list):\n",
" def __init__(self, l):\n",
" for e in l:\n",
" self.append(e)\n",
" MySet.eliminate_duplicate(self)\n",
" \n",
" def __str__(self):\n",
" result = \"MySet: {\"\n",
" for e in self:\n",
" result = result + str(e) + \" ,\"\n",
" result = result[0:len(result)-2] + \"}\"\n",
" return result\n",
"\n",
" @staticmethod \n",
" def eliminate_duplicate(l):\n",
" s = []\n",
" for e in l:\n",
" if e not in s:\n",
" s.append(e)\n",
" l[:] = []\n",
" for e in s:\n",
" l.append(e)\n",
"\n",
" \n",
"if __name__ == \"__main__\":\n",
" s = MySet([1, 2, 2, 3])\n",
" print s\n",
" t = MySet([2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9])\n",
" print t"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [5번 문제] \n",
"\n",
"4번 문제에 정의된 MySet 클래스에 메소드를 추가하여 다음 각 요구사항 모두를 만족시키는 코딩을 제시하시오 \n",
" - 정답을 각 요구사항별로 입력할 필요 없이 요구사항 3개 전체에 대해 1개의 MySet 클래스 정의 코드를 제시하고 주석등으로 해당 코드를 설명한다.\n",
" - 요구사항 1. | 연산으로 두 집합의 합집합을 반환한다.\n",
" > \\>\\>\\> u = s | t
\n",
" > \\>\\>\\> print u
\n",
" > MySet: {1, 2, 3, 4, 5, 6, 7, 8, 9}
\n",
" \n",
" - 요구사항 2. & 연산으로 두 집합의 교집합을 반환한다.\n",
" > \\>\\>\\> u = s & t
\n",
" > \\>\\>\\> print u
\n",
" > MySet: {2, 3}
\n",
"\n",
" - 요구사항 3. - 연산으로 두 집합의 차집합을 반환한다.\n",
" > \\>\\>\\> s = MySet([1, 2, 3])
\n",
" > \\>\\>\\> t = MySet([3, 4, 5])
\n",
" > \\>\\>\\> u = s - t
\n",
" > \\>\\>\\> print u
\n",
" > MySet: {1, 2}
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [6번 문제] \n",
"\n",
"5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오.\n",
" \n",
" >>> s = MySet([1, 2, 3, 4, 5, 6])\n",
" >>> print len(s)\n",
" > 6\n",
" >>> print bool(s)\n",
" > True\n",
" >>> print 2 in s\n",
" > True\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [7번 문제]\n",
"프로젝트 오일러 문제 16\n",
"\n",
"##### [8번 문제]\n",
"프로젝트 오일러 문제 17\n",
"\n",
"##### [9번 문제]\n",
"프로젝트 오일러 문제 18"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [10번 문제] \n",
"\n",
"이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3을 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.\n",
" - 1) 새로운 클래스 WebWordsFrequency를 정의하시오.\n",
" - 이전 Assignment 4에서 고려했던 pickle 모듈등은 전혀 고려하지 마시오.\n",
" - 즉, 하드디스크에 저장하고 다시 로드하는 기능은 본 숙제에는 배제하시오.\n",
" - Assignment 4에서 고려했던 영어 불용어 처리는 적용하시오.\n",
" - Assignment 4에서 처럼 국문 사이트가 아닌 영어 사이트만을 고려하여 아래 사항을 코딩하시오.\n",
" - 2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.\n",
" > \\>\\>\\> w1 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
\n",
" > \\>\\>\\> w2 = WebWordsFrequency('http://www.cnn.com', 'http://www.times.com')
\n",
" > \\>\\>\\> w3 = WebWordsFrequency()
\n",
" - 3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.\n",
" - 반드시 1개의 URL을 추가하도록 구현 (즉, 동시에 여러 개의 URL을 추가하는 것은 배제)\n",
" \n",
" > \\>\\>\\> w1.addUrl('https://github.com')
\n",
" > \\>\\>\\> w3.addUrl('http://stackoverflow.com')
\n",
" - 4) removeUrl() 메소드를 구현하여 URL을 삭제할 수 있도록 한다.\n",
" - 반드시 1개의 URL을 삭제하도록 구현 (즉, 동시에 여러 개의 URL을 삭제하는 것은 배제) \n",
" \n",
" > \\>\\>\\> w1.removeUrl('http://www.cnn.com')
\n",
" > \\>\\>\\> w2.removeUrl('http://stackoverflow.com')
\n",
" - 5) listUrls() 메소드를 구현하여 현재 등록된 모든 URL을 출력하는 기능을 추가\n",
" > \\>\\>\\> w1.listUrls()
\n",
" > http://www.times.com
\n",
" > https://www.amazon.com
\n",
" > https://github.com
\n",
" - 6) getWordsFrequency() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전을 반환하시오.\n",
" - 만약 등록된 URL이 없다면 공백 사전을 반환 \n",
" \n",
" > \\>\\>\\> w1.getWordsFrequency()
\n",
" > {'hello': 8, 'site': 12, 'world': 2, 'science': 11, 'program': 1, 'python': 1}\n",
" - 7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오.\n",
" \n",
" > \\>\\>\\> w1.getMaxFreqencyWords()
\n",
" > site
\n",
" \n",
" - 최다 출현 단어의 빈도수가 동일한 경우 모두 출력해주어야 함 \n",
" \n",
" > \\>\\>\\> w2.getMaxFreqencyWords()
\n",
" > site
\n",
" > science\n",
" \n",
" - 만약 등록된 URL이 없다면 None을 반환\n",
" - 8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.\n",
" > \\>\\>\\> w1.searchUrlByWord(\"news\")
\n",
" > http://www.cnn.com
\n",
" \n",
" - 파라미터로 받은 단어와 유사도가 동일한 URL이 여러 개이면 해당 URL을 모두 출력하시오. \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [11번 문제] \n",
"\n",
"위 10번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.\n",
" - 리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.\n",
" - getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.\n",
" - reverse 인자의 디폴트 값은 false 이며, 기본적으로 내림차순으로 정렬한다.\n",
" - reverse 인자에 true를 넣으면 오름차순으로 정렬한다.\n",
" \n",
" > \\>\\>\\> w4 = OrderedWebWordsFrequency('http://www.times.com', 'https://www.amazon.com', 'https://github.com')\n",
" \n",
" > \\>\\>\\> w4.getWordsFrequency()
\n",
" > [('site', 12), ('science', 11), ('hello', 8), ('world', 2), ('program', 1), ('python', 1)]\n",
" \n",
" > \\>\\>\\> w4.getWordsFrequency(reverse=true)
\n",
" > [('program', 1), ('python', 1), ('world', 2), ('hello', 8), ('science', 11), ('site', 12)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### [12번 문제]\n",
"\n",
"다음과 같은 코딩이 가능하도록 OrderedWebWordsFrequency 안에 반복자와 관련된 메소드를 추가하시오.\n",
"\n",
"> \\>\\>\\> for i in w4:
\n",
"> \\>\\>\\> print i
\n",
"> ('site, 12)
\n",
"> ('science', 11)
\n",
"> ('hello', 8)
\n",
"> ('world', 2)
\n",
"> ('program', 1)
\n",
"> ('python', 1)
"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 0
}