Skip to content

Instantly share code, notes, and snippets.

@allieus
Last active March 2, 2017 16:53
Show Gist options
  • Save allieus/29b205f8555cfbbf33f5aa4ac3e29f5a to your computer and use it in GitHub Desktop.
Save allieus/29b205f8555cfbbf33f5aa4ac3e29f5a to your computer and use it in GitHub Desktop.

서울대 경영대, 2016 벤처창업웹프로그래밍1 (이하 벤1), 파이썬 기말고사 시험문제입니다. 각자 한 번 풀어보세요.

이와 관련해서 질문이 있으신 분은 댓글 혹은 AskDjango 페이스북 그룹 에 질문을 남겨주세요.

벤1 은 파이썬 강의이며, 벤처창업웹프로그래밍2 (이하 벤2) 의 선수과목입니다. 벤2 에서는 Django 웹프레임워크를 1학기 동안 다룹니다.

문제풀이도 공개했습니다. : https://github.com/askdjango/snu-web-2016-09/tree/master/finals

AskDjango 이진석

문제1. Dict Comprehension

아래 코드를 1줄의 Dict Comprehension 코드로 작성하세요.

result = {}
for i in range(100):
    if i % 10 == 3:
        result[i] = i**2
print(result)

1줄 코드 실행을 통해, 다음과 같은 출력결과가 나와야합니다.

{3: 9, 13: 169, 23: 529, 33: 1089, 43: 1849, 53: 2809,
 63: 3969, 73: 5329, 83: 6889, 93: 8649}

Key/Value 쌍만 맞으면 됩니다. 출력순서는 변경되어도 상관없습니다.

문제2. Callable Objects (클래스 버전)

다음 GoodMemoryCalculator 클래스 코드를 완성하세요.

  • GoodMemoryCalculator 클래스의 인스턴스를 호출가능토록 수정해주세요.
  • 인자로 2개의 숫자와 1개의 함수를 받아서, 그 결과를 리턴해주세요.
  • 인자로 받은 함수는 숫자 2개를 받아서 계산결과를 리턴해줍니다.
  • GoodMemoryCalculator 인스턴스를 통한 모든 계산결과를 기억해야합니다. 인스턴스.history 멤버변수를 통해 계산결과에 접근가능토록 해주세요.
  • assert 구문을 모두 통과하셔야 합니다.
class GoodMemoryCalculator(object):
    def __init__(self):
        self.history = []
    # TODO: 구현해주세요.

if __name__ == '__main__':
    calculator = GoodMemoryCalculator()
    assert calculator(1, 2, lambda x, y: x+y) == 3
    assert calculator(1, 10, lambda x, y: x*y) == 10
    assert calculator(100, 10, lambda x, y: x//y) == 10
    assert calculator.history == [3, 10, 10]
    print('PASS')

문제3. Decorators (함수 버전)

base 장식자 함수 버전을 완성하세요.

  • 인자로 함수를 1개 받습니다.
  • 장식하는 함수의 리턴값을 인자로 받아서, 그 계산결과를 리턴해줍니다.
  • assert 구문을 모두 통과하셔야 합니다.
def base(base_fn):
    # TODO: 구현해주세요.

@base(lambda i: i+10)
def mysum(*args):
    '불특정 다수의 Positional Arguments 를 모두 더합니다.'
    result = 0
    for i in args:
        result += i
    return result

@base(lambda i: i*10)
def mymultiply(*args):
    '불특정 다수의 Positional Arguments 를 모두 곱합니다.'
    result = 1
    for i in args:
        result *= i
    return result

if __name__ == '__main__':
    assert mysum(1, 2, 3) == 16
    assert mysum(*range(1, 1001)) == 500510
    assert mymultiply(1, 2, 3, 4) == 240
    print('PASS')

문제4. Decorators (클래스 버전)

Base 장식자 클래스 버전을 완성하세요.

  • 기능적으로는 문제 3 과 동일합니다.
  • assert 구문을 모두 통과하셔야 합니다.
class Base(object):
    '클래스 버전 base 장식자를 구현'
    # TODO: 구현해주세요.

@Base(lambda i: i+10)
def mysum(*args):
    '불특정 다수의 Positional Arguments 를 모두 더합니다.'
    result = 0
    for i in args:
        result += i
    return result
    
@Base(lambda i: i*10)
def mymultiply(*args):
    '불특정 다수의 Positional Arguments 를 모두 곱합니다.'
    result = 1
    for i in args:
        result *= i
    return result

if __name__ == '__main__':
    assert mysum(1, 2, 3) == 16
    assert mysum(*range(1, 1001)) == 500510
    assert mymultiply(1, 2, 3, 4) == 240
    print('PASS')

문제5. CSV 파일 생성

1이상 100000이하의 랜덤수를 1000개 생성하여, 1의 자릿수를 기준으로 그룹을 생성합니다. 그룹내 숫자의 수가 많은 순서대로 랭킹을 만들고, 그 결과를 CSV 파일로 생성합니다.

  • 파이썬 라이브러리인 csv 모듈을 활용하셔야합니다. 직접 문자열 조합은 불가합니다.
  • CSV파일은 cp949 인코딩으로 생성토록 해주세요.
  • open 함수에서 newline='\n' 을 지정해주시면, 엑셀에서 열어보실 때 빈 줄이 생성되는 것을 방지하실 수 있습니다. 디폴트로 '\r\n' 라서 그래요. :)

기본코드

import csv
from collections import defaultdict
import random

def main():
    rank_dict = defaultdict(list)
    for i in range(1000):
        number = random.randint(1, 100000)
        # TODO:
    # TODO:

if __name__ == '__main__':
    main()

실행결과

생성된 CSV파일은 아래와 같은 포맷을 가져야합니다.

랭크,1의자릿수,그룹 내 숫자 갯수,그룹 내 제일큰수,그룹 내 다음 큰수,그룹 내 그 다음 큰수
1,8,128,99888,99848,99748
2,4,115,99664,99594,97524
3,3,110,99603,99203,98393
4,1,103,94171,93521,92561
5,7,101,98157,97567,97107
6,5,97,99945,97265,96775
7,0,90,98370,96450,95570
8,2,90,99222,98902,97882
9,9,85,99919,99709,99139
10,6,81,95816,95216,89356

문제6. 자음 갯수가 많은 단어

인자로 받은 문자열 내 단어를 추출하여, 자음의 갯수가 많은 순서대로 각 그룹을 출력하세요.

  • 단어(Word) 는 White Space (' ', '\t', '\n', etc) 로 구분된 연속된 문자열을 뜻합니다. (Hint: 문자열.split())
  • 한글 이외는 글자는 카운트하지 않습니다.
  • 같은 자음 갯수를 가지는 단어는 동일 순위를 가져아합니다.
  • hangul.py, requests 라이브러리가 필요합니다.
    • hangul.py 모듈을 활용하여, 글자의 초/중/종성을 분리시킬 수 있습니다. 파일을 다운받아서 활용해주세요.
from hangul import hangul
result = hangul.split('가')
print(result)  # ('ㄱ', 'ㅏ', None)

기본 코드

import requests
from hangul import hangul
from collections import defaultdict
JAUM_SET = set(hangul.CHOSUNG_LIST + hangul.JONGSUNG_LIST)  # 자음 집합

def main(article):
    # TODO: 구현해주세요.
    rank_dict = ...
    for (jaum_size, members) in rank_list:
        print(jaum_size, members)

if __name__ == '__main__':
    article = requests.get('https://goo.gl/9L7seu').text
    main(article)

실행결과

다음과 같은 실행결과가 나와야 합니다.

11 ['설정파일입니다.']
9 ['설정파일은']
8 ['기본설정이', '확인해보세요.']
6 ['방식은', '명칭만', '유사합니다.', '프로젝트에', '설정을', '있습니다.', '데이터베이스', '템플릿', '있습니다.', '열어보시어']
5 ['방식과', '개념은', '프로젝트']
4 ['장고의', '등록,', '설정,', '설정,', '설정', '등을', '있는']
3 ['다를', '현재', '대한', '모든', '담고', '장고', '파일', '기본', '어떤']
2 ['뿐,', '거의', '는', '앱', '할', '이니,']
1 ['수', '지']
0 ['MTV', '(Model,', 'Template,', 'View)', 'MVC', '(Model,', 'View,', 'Controller)', 'settings.py', 'STATIC/MEDIA', 'django/conf/global_settings.py']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment