Assignment 4

[정보]

1) Due Date: 2018년 11월 25일 (일), 23시 59분

2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함.

3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오.

4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오.

5) 문제 (마지막 Incremental Project에 집중하기 위하여 이번 숙제에는 ACM-ICPC 문제는 포함하지 않음)

[1번 문제]

파일 s.txt 내의 다음 내용과 함께 아래 문제의 코드를 제시하시오.

pig ham
cat dog
ham bird
dog pig

           - 1) 파일 s.txt을 읽어서 각 라인에 있는 첫 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s1.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s1.txt에 있는 파일 내용은 다음과 같다.

cat dog
dog pig
ham bird
pig ham

           - 2) 파일 s.txt을 읽어서 각 라인에 있는 두 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s2.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s2.txt에 있는 파일 내용은 다음과 같다.

ham bird
cat dog
pig ham
dog pig

           - 3) 파일 s.txt을 읽어서 각 라인들에 있는 모든 단어들을 순차적으로 다시 나열하되 각 라인에 세 개의 단어들이 오도록 하여 s3.txt에 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s3.txt에 있는 파일 내용은 다음과 같다.

pig ham cat
dog ham bird
dog pig

[2번 문제]

다음과 같은 조건들을 참고하여 회원 가입 및 로그인 프로그램을 작성하시오.

  • 1) 프로그램 시작 후 다음과 같은 메시지가 출력되어 1, 2, 3 중 하나의 값을 입력 받도록 한다.

    Welcome to Our Service

    1. Sign Up
    2. Sign In
    3. Quit
  • 2) 1을 선택하면 ID, Password, Name, School의 4가지 정보를 입력받아 파일에 저장하는 프로그램을 작성한다.
    • 2-1) 입력된 내용은 access.txt 라는 이름의 텍스트 파일 내에 저장된다.
    • 2-2) access.txt 파일의 각 라인에는 가입된 회원 각각의 정보가 "[id]: [password], [name], [school]" 형태로 저장된다.
    • 2-3) 즉, 가입 회원이 10명이면 access.txt 파일 내에 라인 수도 정확히 10개이다.
    • 2-4) 암호화 방식은 sha 모듈을 활용한다. sha 모듈 활용 방법은 본 문제의 마지막에 제시된 sha 활용 예를 참고한다.
      • 즉, access.txt 파일 내에 password 정보는 암호화 되어 저장되어야 한다.
    • 2-5) 회원 정보를 입력 받을 때 id를 입력 받은 직후 access.txt를 확인하여 이미 존재하는 id가 입력되었다면 다음 메시지를 출력하고 id 정보를 다시 입력받는다.
      • Sorry, the entered ID is already used.
  • 3) 2를 선택하면 ID, Password의 2가지 정보를 입력받는 프로그램을 작성한다.
    • 3-1) 입력된 ID 정보가 access.txt에 존재하지 않으면 다음과 같은 메시지를 출력하고 다시 입력받는다.
      • Sorry, you are not a registered member.
    • 3-2) 입력된 ID가 올바르게 존재하지만 Password 정보가 access.txt 파일에 있는 정보와 불일치하면 다음과 같은 메시지를 출력하고 Password를 다시 입력받는다.
      • Sorry, the entered password is not correct.
      • 이 때에도 사용자가 입력한 Password 정보와 함께 sha 모듈이 활용되어야 한다.
    • 3-3) 입력된 ID와 Password가 모두 올바르면 다음과 같은 메시지를 출력한다.
      • Hello [name]!
      • 위 [name]에는 access.txt에 기록되어 있는 name 정보를 출력한다.
  • 4) 3을 선택하면 프로그램이 끝난다.
  • [참고] sha 모듈 활용 예
In [10]:
import sha
password_plain = "12345678"
password_encrypted = sha.new(password_plain).hexdigest()
print password_encrypted

# import hashlib
# hasher = hashlib.sha1()
# password_plain = 'ripemd160'
# password_encrypted = hashlib.new(password_plain)
# password_encrypted.hexdigest()
# print(password_encrypted)
<ripemd160 HASH object @ 0x1066a7468>
[3번 문제]

range() 함수와 유사한 frange() 함수를 다음 조건을 참고하여 만드시오.

  • 1) frange()의 인자 구성은 다음과 같이 range와 동일하지만 각 인수들은 음수를 받지 않는다고 가정한다.

    range(stop)
    range(start, stop[, step])

  • 2) frange() 함수의 인자에 대한 기본 시작(start) 값은 0.0이고, 기본 단계(step) 값은 0.1이다.
  • 3) frange 사용 예
    • 3-1) frange(0.5)
      • [0.0, 0.1, 0.2, 0.3, 0.4]
    • 3-2) frange(1.0, 2.0)
      • [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]
    • 3-3) frange(2.2, 4.0, 0.5)
      • [2.2, 2.7, 3.2, 3.7]
[4번 문제]

가변인수를 받는 함수 sum()을 다음과 같은 조건을 참고하여 구현하시오

  • sum() 사용 예
    • sum()
      • 0
    • sum(1, 2)
      • 3
    • sum(1, 2, 3, 4, 5)
      • 15
    • sum(1, 5, 7, 2, -10)
      • 5
[5번 문제]

여러 단어로 이루어진 문자열을 입력받아 각 단어의 첫글자로 이루어진 단어를 대문자로 출력하는 myinitial() 함수를 다음 조건을 참고하여 작성하시오.

  • 1) 다음에 제시되는 함수들을 모두 이용해야 한다.
    • split
    • map
    • join
  • 2) myinitial() 함수 사용 예
    • myinitial("as soon as possible")
      • ASAP
[6번 문제]

음이 아닌 정수 n를 입력받으면 n! (factorial)을 계산하는 myfact() 함수를 재귀적 함수로 구현하시오.

  • [옵션] 참을 수 있는 정도 만큼의 수행시간을 직접 기다려보면서 n을 늘려보도록 합시다.
[7번 문제]

(서술형) import string 과 from string import * 의 차이점을 설명하시오.

[8번 문제]

이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오.

  • 1) 다음 사이트에서 제시되는 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 불용어들을 모두 제거하는 코드를 추가하시오.
  • 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오.
  • 3) 단어의 출현빈도가 담긴 사전 객체를 위 HTML 소스 파일과 동일한 폴더에 파일로 저장하시오.
    • 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오.
    • URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words_frequency.pickle 이다.
      • 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words_frequency.pickle 이다.
  • 4) 최소 5개 이상의 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오.
    • 즉, 5개의 웹 사이트에 대해 총 10개의 파일을 동일한 폴더에 생성하시오.
    • [주의] 가능하면 웹사이트에 단어들이 많고 다루는 주제가 서로 다른 웹 사이트들로 선정하는 것 추천
  • 5) 위 문제에서 저장한 모든 pickle 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오.
    • 반드시 pickle 모듈로 저장한 5개 이상의 pickle 파일들을 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함
  • 6) 간단한 검색엔진 코딩 (Like Google!!!)
    • 사용자에게 임의의 검색어 (하나 또는 여러 단어로 구성) 를 입력받으시오.
      • 예:
        • 대한민국
        • 컴퓨터 공학
        • 맛있는 음식
        • 파이썬을 쉽게 공부하는 법
        • 한기대 장점을 알려주세요
    • 입력받은 검색어들에 대해서도 1)에서 제시하는 방법처럼 불용어 처리를 하여 정리
    • 입력 받은 검색어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오.
      • 검색어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오.
      • 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨.
      • 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순)
      • 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함.
  • 7) [주의] 필수사항
    • 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다.
    • 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 1가지 이상 제시하시오.