#!/usr/bin/env python # coding: utf-8 # # 100 Problems for Python, Computational Mathematics # written by Heesung Shin, Inha University, March 2023 # ## Python 00 # 다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라. # ```python # x = '0' # y = int(x) # z = float(y) # # a = y, # b = list(a) # c = set(b) # # for q in [x, y, z, a, b, c]: # print(q, '\t', type(q)) # ``` # ## Python 01 # `range`를 사용하여 다음 리스트 L을 만들어라. # ```python # L = [2, 5, 8, 11, 14, 17] # ``` # ## Python 02 # `pop`을 사용하여 리스트 L에서 11을 제거하여라. # ```python # L = [2, 5, 8, 11, 14, 17] # ``` # ## Python 03 # `insert`를 사용하여 리스트 L에 100을 8과 14사이에 추가하여라. # ```python # L = [2, 5, 8, 14, 17] # ``` # ## Python 04 # 리스트 L의 모든 원소의 평균 점수를 계산하여라. # ```python # L = [80, 75, 55, 70, 95] # ``` # ## Python 05 # `input`을 사용하여 변수 n에 정수(int) 100을 입력받아 다음 L의 마지막에 추가하여라. # ```python # L = [80, 75, 55, 70, 95] # ``` # ## Python 06 # 인하대학교 학번 `12XXYYYY`에서 3번째와 4번째는 입학년도를 의미한다. # 학생 A의 학번을 다음과 같이 변수 `A_ID` 에 저장하였다. # ```python # A_ID = '12345678' # ``` # 이 변수로 부터 입학년도를 추출하여라. # ## Python 07 # `range(1, 8, 2)`와 f-string을 사용하여 다음과 같이 출력되도록 코드를 완성하여라. # ``` # 사과가 1개가 있다. # 사과가 3개가 있다. # 사과가 5개가 있다. # 사과가 7개가 있다. # ``` # ## Python 08 # 정수 `524287`가 소수(prime number)인지 판별하는 코드를 완성하여라. # ## Python 09 # 정수 `239578885`를 소인수분해 하여라. # ## Python 10 # 다음 입력에 대한 출력을 보고 무엇이 `True`인지 확인하여라. # ```python # X = [None, 1, "", 0, bool(0)] # for x in X: # print(x, "\t", bool(x)) # ``` # ## Python 11 # 다음 중 변수명으로 사용할 수 없는 것이 무엇인지 확인하여라. # # ```python # age = 1 # a = 1 # as = 1 # _age = 1 # 1age = 1 # 나이 = 1 # beautifulIsBetterThanUgly = 100 # beautiful_is_better_than_ugly = 100 # prefer # ``` # ## Python 12 # 딕셔너리를 다음과 같이 만들었다. 출력 값을 예측하고, `weight`의 값을 100으로 변경하고, `blood type`에 'RH+AB'를 추가하여라. # # ```python # d = {'height':180, 'weight':78, 'weight':84, 'temperature':36, 'eyesight':1, } # for i in d: # print(f'{i:>15} {d[i]}') # print() # for k, v in d.items(): # print(f"{k:^15} {v:3d}") # d['weight'] # ``` # ## Python 13 # `sep`과 `end`를 활용하여 다음 소스 코드를 완성하여 날짜와 시간을 `2019/04/26 11:34:27`와 같이 출력되게 수정하여라. # # ```python # year = '2019' # month = '04' # day = '26' # hour = '11' # minute = '34' # second = '27' # # print(year, month, day, end="\n", sep=" ") # print(hour, minute, second, end="\n", sep=" ") # ``` # ## Python 14 # `for` 문을 사용하여 (다음 예시와 같이) 입력된 수에 따라 크기가 정의된 크리스마스 트리 모양이 출력되는 프로그램을 작성하여라. # ``` # * # *** # ***** # ******* # ********* # ``` # ## Python 15 # 공백으로 구분하여 두 숫자를 입력받아, 첫번째 숫자로 두번째 숫자를 나누었을 때, **그 몫**과 **나머지**를 공백으로 구분하여 출력하세요. # ``` # 10000 123 # 81 37 # ``` # ## Python 16 # 공백으로 구분하여 두 숫자 $a$와 $b$가 주어지면, $a$의 $b$제곱과 $b$의 $a$의 제곱의 합($=a^b+b^a$)의 값을 구하는 프로그램을 작성하세요 # ## Python 17 # 국어, 수학, 영어 시험을 보았습니다. # 공백으로 구분하여 세 과목의 점수가 주어지면 `전체 평균 점수`를 구하는 프로그램을 작성하세요. (단, 소숫점 이하는 모두 버립니다.) # ``` # 20 30 40 # 30 # ``` # ## Python 18 # $3$으로 나눈 나머지가 $2$인 $100$미만의 자연수를 모두 곱한 수의 값을 `m`이라 할 때, 다음은 `m`을 구하는 코드이다. # ```python # m = 1 # for k in range(2, 100, 3): # m *= k # print(m) # ``` # 위의 코드를 `reduce`와 `lamdba`을 사용하여 변경하여라. # ## Python 19 # $3$으로 나눈 나머지가 $2$인 $100$미만의 자연수를 모두 곱한 값의 각 자리수의 합을 `s`라 할 때, 다음은 `s`를 구하는 코드이다. # ```python # m, s = 1, 0 # for k in range(2, 100, 3): # m *= k # for x in str(m): # s += int(x) # print(s) # ``` # 위의 코드 중 합을 구할 때 List Comprehension을 사용하여 간단하게 변경하여라. # ## Python 20 # `dir`은 대상 객체에 적용할 수 있는 method 를 모두 보여준다. # ```python # >>> print( dir('') ) # # ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] # ``` # 이 중에서 정수로 변환가능한 문자열인지 확인하는 method를 찾아보고, 다음 코드에 쓰인 Method의 차이를 설명하여라. # ```python # for s in ['123', '3²', '⅔', '12.3']: # print(s.isdecimal(), s.isdigit(), s.isnumeric(), ) # ``` # ## Python 21 # 우리 태양계를 이루고 있는 행성은 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성으로 총 8개 입니다. # 수를 입력받아 그 순서에 해당하는 행성의 이름을 출력하는 코드를 완성하여라. # 예를 들어, 3번째 행성은 지구입니다. # ## Python 22 # 문장이 입력되면 거꾸로 출력하는 프로그램을 만들어 봅시다. # # ``` # 제 이름은 똑바로 읽어도 거꾸로 읽어도 우영우입니다. 기러기 토마토 스위스 인도인 별똥별 우영우 # 우영우 별똥별 인도인 스위스 토마토 기러기 .다니입우영우 도어읽 로꾸거 도어읽 로바똑 은름이 제 # ``` # ## Python 23 # 학기가 시작되고, 학생들이 돌아가면서 자기소개를 하기로 했습니다. # ```python # name = "홍길동" # age = 19 # ``` # 위와 같이 name과 age 두 변수가 주어지면 다음과 같이 출력하는 코드를 만들어 주세요. # # > 안녕하세요. 제 이름은 홍길동이고 19살 입니다. # > 저는 19살인 홍길동입니다. # > 저는 홍길동이고 지금 19세 입니다. # # 이 때 첫번째, 두번째, 세번째 출력은 각각 formatting, format method, f-string 을 이용하세요. # ## Python 24 # 딸기 게임을 합니다. # 입력이 `바나나 1`이면 `() () () 바나나`를 출력하고, # 입력이 `사과 3`이면 `() 사과 사과 사과`를 출력하는 코드를 완성하세요. # ## Python 25 # 알파벳을 포함한 문장을 입력받아 그 중 대문자만 출력해주는 프로그램을 만들어보세요. # # ``` # Python Is Powerful. # PIP # ``` # ## Python 26 # 문장이 입력되면 각 단어별로 첫글자는 소문자, 나머지 글자는 대문자로 출력되는 코드를 만들어라. # ``` # I have NEVER beeN to Paris. # i hAVE nEVER bEEN tO pARIS. # ``` # ## Python 27 # `6-gram`이란 문자열에서 6개의 연속된 요소를 출력하는 방법입니다. # 예를 들어 'Wonderful'을 `6-gram`으로 반복해 본다면 다음과 같은 결과가 나옵니다. # ``` # Wonder # onderf # nderfu # derful # ``` # 입력으로 문자열이 주어지면 `6-gram`으로 출력하는 프로그램을 작성해 주세요. # ## Python 28 # 우리 태양계를 이루는 행성은 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성이 있습니다. # 이 행성들의 영어 이름은 Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune입니다. # 행성의 한글 이름을 입력하면 영어 이름을 반환하는 코드를 완성하여라. # (단, 태양계 안에 속하지 않은 행성의 경우에는 `No value.`를 출력하여라.) # ## Python 29 # 다음 소스 코드에서 세 부분의 `pass` 부분을 수정하여 다음과 같은 출력이 나오도록 클래스 작성을 완성하여라. # ```python # class Student: # def __init__(self, **s): # self.name = s['name'] # 이름 # pass # 학번 # self.age = s['age'] # 나이 # # def add_class(self): # 졸업연도 # if self.ID[1] == '1': # self.class_of = int('19'+self.ID[2:4]) + 4 # elif self.ID[1] == '2': # pass # else: # self.class_of = None # return self.class_of # # def __repr__(self): # r = f"{self.name}, whose ID is the number {self.ID}, are {self.age} years old" # try: # pass # except: # r += "." # return r # # x = Student(name = 'Hong Gildong', id = '12345678', age = '23') # print(x) # # x.add_class() # print(x) # ``` # #### 출력 # ``` # Hong Gildong, whose ID is the number 12345678, are 23 years old. # Hong Gildong, whose ID is the number 12345678, are 23 years old in class of 2038. # ``` # ## Python 30 # 원의 넓이는 `반지름의 길이 X 반지름의 길이 X 3.14`입니다. # 입력으로 원의 넓이가 주어진 반지름의 길이를 반환하는 함수 `radius`를 만들어라. # ```python # >>> radius(63.585) # 4.5 # ``` # ## Python 31 # 입력된 수 보다 작은 모든 소수를 갖는 리스트를 리턴값으로 가지는 함수 `primes`를 작성하여라. # ```python # >>> primes(50) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] # ``` # ## Python 32 # n번째 소수를 리턴하는 함수 `nth_prime`을 만들어라. # ```python # >>> nth_prime(10) # 29 # ``` # ## Python 33 # 주어진 `L = [3, 8, 4, 2, 7]`의 각 원소에 대하여 `nth_prime` 함수값을 원소로 하는 리스트 `[5, 19, 7, 3, 17]`를 만들어라. # ## Python 34 # 학생들의 키(height)가 쉼표(comma)로 구분되는 문자열로 주어진다. 큰 학생부터 작은 학생 순서대로 작성되었는지 참/거짓을 확인하는 함수 `height`를 작성하여라. # ```python # >>> height('156,155,165,169,166,176') # False # # >>> height('176,169,166,165,156,155') # True # ``` # ## Python 35 # 다음과 같이 첫번째 입력으로 문장이 주어지고 두번째 입력으로 찾을 단어가 주어지면, 그 단어가 시작하는 위치(index)를 반환하는 프로그램을 만들어라. # (단, 문장에 단어가 없는 경우에는 `False`을 반환한다.) # ``` # pineapple is yummy # apple # 4 # ``` # ## Python 36 # 첫 줄에는 학생의 이름이 공백으로 구분되어 입력되고, 두번째 줄에는 그 학생의 수학 점수가 공백으로 구분되어 주어진다. # `zip` 명령을 이용하여, 입력된 두 줄을 합쳐 **학생의 이름이 key**이고 **그 학생의 점수가 value**인 딕셔너리를 반환하여라. # # ``` # Yujin Hyewon Gildong # 70 100 80 # {'Yujin': 70, 'Hyewon': 100, 'Gildong': 80} # ``` # ## Python 37 # 다음과 같이 19x19단 결과 중 홀수단만 출력하는 프로그램을 작성하세요. # ``` # | 11x 1= 11 | 13x 1= 13 | 15x 1= 15 | 17x 1= 17 | 19x 1= 19 | # | 11x 2= 22 | 13x 2= 26 | 15x 2= 30 | 17x 2= 34 | 19x 2= 38 | # | 11x 3= 33 | 13x 3= 39 | 15x 3= 45 | 17x 3= 51 | 19x 3= 57 | # | 11x 4= 44 | 13x 4= 52 | 15x 4= 60 | 17x 4= 68 | 19x 4= 76 | # | 11x 5= 55 | 13x 5= 65 | 15x 5= 75 | 17x 5= 85 | 19x 5= 95 | # | 11x 6= 66 | 13x 6= 78 | 15x 6= 90 | 17x 6=102 | 19x 6=114 | # | 11x 7= 77 | 13x 7= 91 | 15x 7=105 | 17x 7=119 | 19x 7=133 | # | 11x 8= 88 | 13x 8=104 | 15x 8=120 | 17x 8=136 | 19x 8=152 | # | 11x 9= 99 | 13x 9=117 | 15x 9=135 | 17x 9=153 | 19x 9=171 | # | 11x10=110 | 13x10=130 | 15x10=150 | 17x10=170 | 19x10=190 | # | 11x11=121 | 13x11=143 | 15x11=165 | 17x11=187 | 19x11=209 | # | 11x12=132 | 13x12=156 | 15x12=180 | 17x12=204 | 19x12=228 | # | 11x13=143 | 13x13=169 | 15x13=195 | 17x13=221 | 19x13=247 | # | 11x14=154 | 13x14=182 | 15x14=210 | 17x14=238 | 19x14=266 | # | 11x15=165 | 13x15=195 | 15x15=225 | 17x15=255 | 19x15=285 | # | 11x16=176 | 13x16=208 | 15x16=240 | 17x16=272 | 19x16=304 | # | 11x17=187 | 13x17=221 | 15x17=255 | 17x17=289 | 19x17=323 | # | 11x18=198 | 13x18=234 | 15x18=270 | 17x18=306 | 19x18=342 | # | 11x19=209 | 13x19=247 | 15x19=285 | 17x19=323 | 19x19=361 | # ``` # ## Python 38 # 학생들이 선택한 후보들을 입력 받으면, 가장 많이 선택된 학생의 이름과 받은 표 수를 출력하는 프로그램을 작성하여라. # ``` # 원범 원범 유진 혜원 유진 혜원 유진 유진 # 유진(이)가 총 4표로 반장이 되었습니다. # ``` # ## Python 39 # pass 부분을 수정하여 2제곱, 3제곱, 제곱근을 할 수 있는 함수를 반환하는 `power` 함수를 만들어라. # ```python # def power(n): # def func(value): # pass # return func # # two = power(2) # three = power(3) # root = power(0.5) # # print([two(x) for x in range(6)]) # print([three(x) for x in range(6)]) # print([root(x) for x in range(6)]) # ``` # #### 출력 # ``` # [0, 1, 4, 9, 16, 25] # [0, 1, 8, 27, 64, 125] # [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979] # ``` # ## Python 40 # 문자열을 입력받으면 단어 수와 글자 수를 각각 출력하는 프로그램을 작성해 주세요. # ``` # 저는 인하대학교 수학과 유진입니다 # 입력된 문장은 4 단어, 15 글자로 구성되어 있습니다. # ``` # ## Python 41 # 한 줄에 여러 개의 숫자가 입력되면, 중앙에서 가까운 순서대로 출력하는 프로그램을 작성하시오. # (중간에서 동일한 거리에 있는 경우에는 앞쪽에 있는 것을 먼저 출력한다.) # # ``` # 5 6 4 7 3 8 2 9 1 10 # 3 8 7 2 4 9 6 1 5 10 # ``` # ## Python 42 # $n$등이란 자기 보다 점수가 높은 학생의 수가 $n-1$ 명이 있다는 의미입니다. # 학생들의 점수를 공백으로 구분하여 입력받아, 각 학생의 등수를 출력하세요. # ``` # 94 86 75 94 55 94 85 97 94 97 # 3 7 9 3 10 3 8 1 3 1 # ``` # ## Python 43 # 미국에서는 QWERTY 라고 불리는 레이아웃을 가진 키보드를 사용하지만, 프랑스에서는 AZERTY라고 불리는 레이아웃을 가진 키보드를 사용합니다. # 두 키보드의 배열은 대부분 같지만, A와 Q 그리고 Z와 W가 서로 위치가 바뀌어 있습니다. # `maketrans`와 `translate` 메소드를 사용하여 문장이 입력되면 모든 A와 Q, Z와 W를 각각 서로 바꾸는 프로그램을 작성해 주세요. # ``` # Qzesome. Hello, my nqme is Hyezon. # Awesome. Hello, my name is Hyewon. # ``` # ## Python 44 # 2040년 1월 1일은 일요일입니다. # `datetime` 모듈을 사용하여, 두 수 a와 b를 입력받아 2040년 a월 b일이 무슨 요일인지 리턴하는 함수 `day_2040`을 완성하여라. # (단, 요일의 이름은 일요일부터 토요일까지 각각 SUN, MON, TUE, WED, THU, FRI, SAT 입니다.) # ```python # >>> day_2040(5, 24) # 'THU' # ``` # ## Python 45 # python의 모듈 중 하나인 `time 모듈`은 1970년 1월 1일 0시 0분 0초 이후로부터 지금까지 흐른 시간을 GMT 시간을 기준으로 초단위로 반환합니다. # 다음 코드에서 변수 `t`를 사용하여, 현재 시간을 한국표준시(GMT+9)로 변환하여 `hh시 mm분 ss초` 형태로 출력하여라. # ```python # from time import time # t = time() # ``` # ## Python 46 # 사용자가 입력한 양의 정수의 각 자리수의 합을 출력해주세요. # ``` # 1357924680 # 45 # ``` # ## Python 47 # 우리가 흔히 사용하는 숫자 1, 8, 19, 28893 등등...은 10진수 체계입니다. 이를 3진수로 바꾸려고 합니다. # 예를 들어 46은 $46 = (1\times 3^3) + (2 \times 3^2) + (0 \times 3^1) + (1 \times 3^0)$ 이므로 `1201`으로 표현합니다. # 사용자에게 숫자를 입력받고 이를 3진수를 바꾸고 그 값을 출력하여라. # ``` # 123456789 # 22121022020212200 # ``` # ## Python 48 # 어떤 놀이기구는 한 번에 타는 인원은 최대 5명이고, 제한 무게는 100kg로서, 최대인원 혹은 제한무게를 초과하면 무조건 다음 기구를 타야 합니다. # 탑승할 친구들의 몸무게가 순서대로 주어질 때, 한 번에 탑승할 인원별로 몸무게로 나누어 표시하는 프로그램을 작성하세요. # # ``` # 50 40 20 20 10 55 50 30 # 1번째. (50, 40) # 2번째. (20, 20, 10) # 3번째. (55,) # 4번째. (50, 30) # ``` # ## Python 49 # 2개 이상의 숫자가 공백으로 구분되어 문자열로 주어진다. 주어진 숫자들 중 최댓값(Maximum), 최솟값(Minimum), 평균값(Mean), 중간값(Median)을 출력하여라. # (단, 주어진 숫자의 개수가 짝수인 경우에는 중간에 가까운 두 수의 평균을 중간값으로 계산한다.) # ``` # 9 7 3 4 3 6 2 9 2 5 4 6 # Maximum. 9 # Minimum. 2 # Mean. 5.0 # Median. 4.5 # ``` # ## Python 50 # 총 문자열의 길이는 50으로 제한하고 사용자가 문자열을 입력하면 그 문자열을 가운데 정렬을 해주고, 나머지 빈 부분에는 '#'을 채워넣어주세요 # ``` # hello # ######################hello####################### # ``` # ## Python 51 # 1부터 20까지 1의 개수를 세어본다면 1이 들어간 수는 1, 10 11, 12, 13, 14, 15, 16, 17, 18, 19가 있고 11은 1이 2번 들어갔으므로, 총 12개의 1이 있습니다. # 86부터 739까지 수에서 0, 1, 2, ..., 9까지의 숫자가 각각 몇 개씩 사용되었는지 출력하세요. # ## Python 52 # 공백으로 구분되는 자연수가 입력되었을 때, 이 자연수가 연속된 수들로만 구성된 것인지 아닌지 판별하고자 한다. # 연속된 자연수로 구성되지 않은 경우에는 빠진 자연수를 출력하고, 연속된 자연수로 구성된 경우에는 `True`를 출력하여라. # ``` # 1 4 7 5 3 # [2, 6] # ``` # ## Python 53 # 인하대학교에서 주최하는 행사 접수를 위해 설문지를 배포하였습니다. # 이름과 휴대폰 번호를 수집하였는데, 중복된 데이터들을 삭제하여 실제 접수 명단이 몇 명인지 알고 싶습니다. # 휴대폰 번호를 키, 이름을 값으로 하는 딕셔너리로 변경하여, 실제 접수 인원을 확인하여라. # ```python # people = [ # ('이호준', '01050442903'), # ('이호상', '01051442904'), # ('이준호', '01050342904'), # ('이준호', '01051239876'), # ('이호준', '01050442903'), # ('이준', '01050412904'), # ('이호', '01050443904'), # ('이호준', '01050442903'), # ] # ``` # ## Python 54 # 다음과 같이 국가 이름과 넓이의 자료가 딕셔너리가 주어졌다. # 국가별로 한국과 넓이의 차를 값으로 딕셔너리를 만들고, 넓이의 차에 따른 순서에 따라 내림 차순으로 정렬하여 출력하여라. # (단, 넓이의 차는 항상 양수이고 한국은 출력하지 않는다.) # ```python # nationWidth = { # 'Korea' : 220877, # 'Rusia' : 17098242, # 'China' : 9596961, # 'France' : 543965, # 'Japan' : 377915, # 'England': 242900, # } # ``` # ## Python 55 # 숫자를 입력 받아서 만단위로 콤마(,)가 찍힌 문자열로 변환하여라. # ``` # 1234567890 # 12,3456,7890 # ``` # ## Python 56 # 하노이의 탑은 프랑스 수학자 에두아르드가 처음으로 발표한 게임입니다. 하노이의 탑은 A, B, C 3개의 기둥과 기둥에 꽂을 수 있는 N개의 원판으로 이루어져 있습니다. 이 게임에서 다음의 규칙을 만족해야 합니다. # # > 1. 처음에 모든 원판은 A기둥에 꽂혀 있다. # > 1. 모든 원판의 지름은 다르다. # > 1. 이 원반은 세 개의 기둥 중 하나에 반드시 꽂혀야 한다. # > 1. 작은 원반 위에 큰 원반을 놓을 수 없다. # > 1. 한 번에 하나의 원판(가장 위에 있는 원판) 만을 옮길 수 있다. # 이 규칙을 만족하며 A기둥에 있는 원반 N개를 모두 C 원반으로 옮기고 싶습니다. # `*ARGS1`, `*ARGS2`, `*ARGS3` 부분을 수정하여, 최소한의 이동으로 모든 원반을 옮기기 위한 방법을 제시하는 프로그램을 완성하여라. # ```python # def Hanoi(n, start, via, end): # # 원반이 1개일 경우에는 바로 옮긴다. # if n == 1: # return [(start, end)] # # 원반이 1개 이상일 경우에는 n-1개를 경유기둥으로 옮긴다. # L = Hanoi(*ARGS1) # # 가장 큰 원반은 목표기둥으로 옮긴다. # L.append(*ARGS2) # # 경유기둥에 있는 n-1개를 목표기둥으로 옮긴다. # L += Hanoi(*ARGS3) # return L # # N=3 # path = Hanoi(N, 'A', 'B', 'C') # for k, x in enumerate(path): # print(f"{k+1:2} step. Move one disk from {x[0]} to {x[1]}.") # ``` # #### 출력 # ``` # 1 step. Move one disk from A to C. # 2 step. Move one disk from A to B. # 3 step. Move one disk from C to B. # 4 step. Move one disk from A to C. # 5 step. Move one disk from B to A. # 6 step. Move one disk from B to C. # 7 step. Move one disk from A to C. # ``` # ## Python 57 # 이름을 가나다 순서대로 나열하여 번호를 매기려고 합니다. # `enumerate`를 활용하여 코드에 입력된 이름을 아래와 같이 출력해주세요. # # ```python # student = [ # '강은지', '김유정', '박현서', # '최성훈', '홍유진', '박지호', # '권윤일', '김채리', '한지호', # '김진이', '김민호', '강채연', # ] # ``` # ``` # 번호. 1 / 이름. 강은지 # 번호. 2 / 이름. 강채연 # 번호. 3 / 이름. 권윤일 # 번호. 4 / 이름. 김민호 # 번호. 5 / 이름. 김유정 # 번호. 6 / 이름. 김진이 # 번호. 7 / 이름. 김채리 # 번호. 8 / 이름. 박지호 # 번호. 9 / 이름. 박현서 # 번호. 10 / 이름. 최성훈 # 번호. 11 / 이름. 한지호 # 번호. 12 / 이름. 홍유진 # ``` # ## Python 58 # 완전 거듭제곱(perfect power)이란 2 이상의 정수 $m$과 $k$에 대하여 $m^k$ 형태로 표현되는 수를 말한다. # 예를 들어, $27 = 3^3$, $49 = 7^2$과 같은 수가 완전 거듭제곱이고, 100 이하의 모든 완전 거듭제곱은 다음과 같다. # ``` # 4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 81, 100 # ``` # 1000 이하의 모든 완전 거듭제곱을 출력하여라. # ## Python 59 # 완전 거듭제곱의 집합을 `P`라고 할 때, 다음의 값을 예측하여라. # $$\sum_{p \in P} \frac{1}{p-1} = \frac{1}{3} + \frac{1}{7} + \frac{1}{8} + \frac{1}{15} + \frac{1}{24} + \frac{1}{26} + \frac{1}{31} + \cdots$$ # ## Python 60 # '복잡한 세상 편하게 살자' 라는 문장을 '복세편살'로 줄여 말하는 것처럼, 어떤 입력이 주어지면 띄어쓰기를 기준으로 앞 글자만 줄여 출력하여라. # # ``` # 복잡한 세상 편하게 살자 # 복세편살 # ``` # ## Python 61 # 아래 기준을 만족하면서 `20390923`을 출력하는 코드를 작성하세요 # - 코드 내에 숫자가 없어야 합니다. 예를 들어, print(20390923)이라고 하시면 안됩니다. # - 파일 이름이나 경로를 사용해서는 안됩니다. # - 시간, 날짜 함수를 사용해서는 안됩니다. # - 에러 번호 출력을 이용해서는 안됩니다. # - input을 이용해서는 안됩니다. # ## Python 62 # 문자열을 입력받으면 순서를 유지한 채 중복된 자료를 제거하여라. (단, 딕셔너리의 `fromkeys` 메소드를 사용하지 않는다.) # ``` # 5 1 5 a 2 1 5 1 d b 2 3 b d 3 2 a c 5 d 2 a # 5 1 a 2 d b 3 c # ``` # ## Python 63 # 다음과 같이 길이가 같은 두 개의 리스트가 정의되었다. # ```python # A = ['1', '2', '3', '4'] # B = ['a', 'b', 'c', 'd'] # ``` # 위의 두 변수를 활용하여 `[['1', 'a'], ['b', '2'], ['3', 'c'], ['d', '4']]`와 같이 두 리스트의 원소를 쌍으로 결합하되 쌍의 순서가 번갈아 등장하도록 출력하여라. # ## Python 64 # 정량 N에 정확히 맞춰야만 움직이는 이상한 화물용 엘레베이터가 있습니다. # 화물 포장은 7kg, 3kg 두 가지이며, 엘레베이터를 움직이기 위해 포장된 화물의 개수를 최대한 적게 사용하고 싶습니다. # 예를 들어 화물 정량이 24kg이라면 3kg 화물 8개를 옮기는 것 보다는 7kg 화물 3개와 3kg 화물 1개, 즉 4개의 화물을 옮기는 것이 효율적입니다. # 엘레베이터 정량 N이 입력되었을 때, 가장 적게 필요한 화물을 출력하여라. 만약 어떻게 해도 정량이 N이 되지 않는다면 `False`를 출력하여라. # ``` # 24 # [(7, 3), (3, 1)] # ``` # ## Python 65 # 블럭은 알파벳 대문자로 표시하고, 이 블럭으로 탑을 쌓는 순서는 문자열로 표시합니다. # 쌓는 규칙 역시 문자열로 표시됩니다. # 규칙에서 어떤 두 블럭을 선택하더라도 탑에서 그 순서가 유지 되면 탑이 무너지지 않습니다. # # 예를 들면 규칙이 `BAC` 라면 # 탑 `BDADBDCCD`는 3번째 A와 5번째 B가 규칙을 만족하지 않으므로 탑은 무너지고, # 탑 `BDADADCCD`는 규칙을 만족하고 탑은 무너지지 않습니다. # # 규칙을 첫번째 입력하고, 탑은 두번째에 공백을 기준으로 입력할 때, 각각의 탑에 대하여 무너지지 않으면 `True`, 무너지면 `False`를 출력하여라. # # ``` # ABCD # ABCDEF BCAD ADEFQRX BEDFG AEBFDGCH # True False True True False # ``` # ## Python 66 # 광장에서 모인 사람들과 악수를 하는 행사가 열렸다. # 악수는 1대 1로 진행되었으며, 인철이는 몇 명의 사람들과 악수를 한 후 중간에 일이 생겨 집으로 갔다. # (인철이는 최소 1번 악수를 했으며, 집에 가기 전에 모두와 악수를 했을 수도 있다.) # 인철이를 제외한 모든 참가자는 행사가 끝날 때 까지 참석하면서, 남아 있는 모든 참가자와 한 번씩 악수를 했다. # 이 때 같은 상대와 중복된 악수가 없었고, 진행된 악수는 총 $n$ 번이라고 하자. # 인철이가 악수한 횟수와 전체 행사참가자 수를 구하는 함수 `solve`를 작성하여라. # # 예를 들어 59회의 악수가 행사에서 진행되었다고 하면, 인철이를 포함한 전체 행사참가자는 12명이고, 인철이는 4번의 악수 후 집으로 돌아갔다. # ```python # >>> solve(59) # (12, 4) # ``` # ## Python 67 # 버스시간표와 현재 시간이 주어졌을 때 버스 도착 시간이 얼마나 남았는지 알려주는 함수 `notice`를 작성하여라. # - 버스 시간표와 현재시간이 입력으로 주어집니다. # - 출력 포맷은 "00시간 00분 남음", "00시간 00분전 출발", "지금 출발"입니다. # # ``` # time_table = ["12:30", "12:50", "13:20", "13:55", "15:45"] # now = "12:50" # notice(time_table, now) # ``` # # ``` # ['00시간 20분전 출발', '지금 출발', '00시간 30분 남음', '01시간 05분 남음', '02시간 55분 남음'] # ``` # ## Python 68 # `골드바흐의 추측`(`Goldbach's conjecture`)은 오래전부터 알려진 정수론의 미해결 문제로, # 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것이다. # 이때 하나의 소수를 두 번 사용하는 것은 허용한다. - 위키백과 # # 위 설명에서 2보다 큰 모든 짝수를 두 소수의 합으로 나타낸 것을 골드바흐 분할이라고 합니다. # # - 100 = 47 + 53 # - 56 = 19 + 37 # # 2보다 큰 짝수 n이 주어졌을 때, 골드바흐 분할 $(a,b)$를 모두 출력하는 함수 `Goldbach`를 작성하여라. (단, $a\leq b$) # ```python # >>> Goldbach(122) # [(13, 109), (19, 103), (43, 79), (61, 61)] # ``` # ## Python 69 # 행렬 2개가 주어졌을 때 곱할 수 있는 행렬인지 확인하고 곱할 수 있다면 그 결과를, 곱할 수 없다면 `False`를 출력하는 함수 `mul`을 작성하여라. # (단, 라이브러리는 사용을 하지 않습니다.) # # ```python # >>> X = [[1, 2, 3], # ... [4, 5, 6],] # >>> Y = [[1, 2], # ... [3, 4], # ... [5, 6],] # >>> mul(X, Y) # [[22, 28], [49, 64]] # ``` # ## Python 70 # 다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라. # ```python # A = [1,2,3] # B = A # C = A[:] # # print(A, id(A)) # print(B, id(B)) # print(C, id(C)) # # print(A == B, A is B, id(A) == id(B)) # print(A == C, A is C, id(A) == id(C)) # # A[1] = 10 # B.append(100) # C.pop() # print(A, B, C) # ``` # ## Python 71 # 다음 코드를 실행하여 결과를 확인하고, 문제점을 지적하고, 첫 줄을 변경하여 문제점을 해결하여라. # ```python # A = [[0],[1]] * 3 # B = [id(k) for k in A] # print(A) # print(B) # # A[1][0] = 10 # A[2].append(100) # A[5] = [1000] # print(A) # ``` # ## Python 72 # 문자열을 입력받아 다음과 같이 연속되는 문자열을 압축해서 표현하고 싶습니다. # ``` # aaabbccccccasss # a3b2c6a1s3 # ``` # ## Python 73 # `369 게임`을 하는데 조금 이상한 규칙이 있습니다. 3이나 6, 9 로만 이루어진 수일 때만 박수를 쳐야합니다. # 예를 들어 13, 16과 같이 3과 6, 9 만으로 숫자가 아닐 경우엔 박수를 치지 않습니다. # 현재 36일 때 36 이전까지 박수를 친 것은 3, 6, 9, 33 으로 총 4번입니다. # 숫자를 입력하면 그 숫자 이전까지 박수를 친 번호를 출력하는 함수 `clap`을 완성하여라. # ```python # >>> clap(65) # [3, 6, 9, 33, 36, 39, 63] # ``` # ## Python 74 # 지뢰를 제거하기 위해 수색반을 투입합니다. # 수색반은 도시를 격자 무늬로 나눠놓고 자신들이 수색할 수 있는 범위 내에 가장 많은 지뢰가 매립된 지역을 가장 먼저 작업하고 싶습니다. # - 수색반이 한번에 수색 가능한 범위가 `N x N` 입니다. # - 도시 내 지뢰가 있는지를 변수 `L`에 표시합니다. 0은 지뢰가 없음 1은 지뢰가 있음을 뜻합니다. # # 수색 가능한 범위 `N x N` 내에서 찾아낼 수 있는 가장 큰 지뢰의 개수를 구하는 함수 `max_mine`을 작성하여라. # ```python # >>> N = 3 # >>> L = [[1, 0, 0, 1, 0, 1], # ... [0, 1, 0, 0, 0, 0], # ... [0, 1, 0, 1, 1, 1], # ... [0, 0, 0, 0, 0, 0], # ... [0, 0, 1, 0, 0, 1], # ... ] # >>> max_mine(L, N) # 5 # ``` # ## Python 75 # 깃발 주위에는 동서남북 방향으로 4개의 지뢰가 있습니다. # (단, 깃발이 붙어있는 경우에도 깃발 아래에는 지뢰가 없습니다.) # 깃발의 위치가 행렬 형태로 주어집니다. 깃발이 없는 곳은 0, 깃발이 있는 곳은 1입니다. # # 깃발의 위치를 입력받아 지뢰와 함께 출력해주는 함수 `mine`을 작성하여라. # # ``` # >>> A = [[0, 1, 0, 0, 0, 0], # ... [0, 0, 0, 0, 0, 0], # ... [0, 0, 0, 1, 1, 0], # ... [0, 0, 1, 0, 0, 0], # ... [0, 0, 0, 0, 0, 0], # ... ] # >>> mine(A) # * f * 0 0 0 # 0 * 0 * * 0 # 0 0 * f f * # 0 * f * * 0 # 0 0 * 0 0 0 # ``` # ## Python 76 # 부분문자열(Subsequence)이란 어떤 문자열에서 연속되어 나열되어 있는 문자열을 말합니다. # 공통 부분문자열(Common Subsequence)이란 두 문자열에서 공통으로 들어 있는 부분문자열을 말합니다. # `가장 긴 공통 부분문자열`(Longest Common Subsequence)이란 두 문자열이 주어졌을 때 이들의 공통 부분문자열 중 가장 긴 것을 말합니다. # # 예를 들어 S1 = 'THISISSTRINGS' S2 = 'THISIS'라는 두 문자열이 있을 때 둘 사이의 부분 공통 문자열의 길이는 'THISIS'의 6개가 됩니다. # # 이처럼 두 문자열이 주어지면 가장 긴 부분 공통 문자열의 길이를 반환하는 함수 `LCS`를 만들어 주세요. # 이 두 문자열에 `가장 긴 부분 공통 문자열`이 여러 개 존재할 수 있으므로 모두 모아 리스트 형태로 반환하면 됩니다. # ```python # >>> S = 'THISISSTRINGS' # >>> T = 'KIOTHISKESSISSKTKKQQAEW' # >>> LCS(S,T) # ['THIS', 'SISS'] # ``` # ## Python 77 # 중국집에 원형테이블 위에 시계방향으로 1번 음식 부터 N번 음식까지 있습니다. # 한 개의 음식을 먹고 나서 다 먹은 음식의 접시는 치우고 시계방향으로 K번째 음식을 먹습니다. # 처음에 1번 음식을 먹기 시작하고, 마지막에 2개의 음식을 남긴다고 할 때, 마지막에 남는 음식을 출력하는 함수 `food(N, K)`를 작성하여라. # # 예를 들어, `N=7`, `K=4` 인 경우에 1 > 5 > 3 > 2 > 4 번호 순서로 음식을 먹고, 6과 7의 접시가 남습니다. # # ```python # >>> food(7, 4) # [6, 7] # ``` # ## Python 78 # 리스트의 순회는 맨 뒤의 원소를 맨 앞으로 옮기는 것 입니다. # 예를 들어 리스트 `L`을 2번 순회하면 리스트 `M`이 되고, 두 리스트 `L`과 `M`의 원소별 차이는 다음과 같습니다. # ```python # L = [25, 27, 34, 35, 39, 10, 20] # M = [10, 20, 25, 27, 34, 35, 39] # 차이 = [15, 7, 9, 8, 5, 25, 19] # ``` # 이 때, 리스트의 차 중 최솟값은 4번째 인덱스의 39와 34의 차인 5입니다. # 리스트 `L`과 순회 횟수 `n`이 주어질 때, 리스트의 차 중 최솟값이 되는 인덱스와 두 원소, 그리고 그 차를 출력하는 함수 `cycle(L, n)`을 작성하여라. # # ```python # >>> L = [25, 27, 34, 35, 39, 10, 20] # >>> n = 2 # >>> cycle(L, n) # [4, (39, 34), 5] # ``` # ## Python 79 # `조합`이란 원소들을 조합하여 만들 수 있는 경우의 수이며 원소의 순서는 신경쓰지 않습니다. # 문자열 `s`에서 사용된 영문 대문자 중 `n`개를 선택하여 나올 수 있는 모든 조합과 그 수를 출력하는 함수 `comb(s, n)`를 `itertools` 모듈을 사용하여 작성하여라. # ```python # >>> import itertools, string # >>> s = "Life is Short, You Need Python!" # >>> n = 3 # >>> comb(s, n) # ['LSY', 'LSN', 'LSP', 'LYN', 'LYP', 'LNP', 'SYN', 'SYP', 'SNP', 'YNP'] # ``` # ## Python 80 # 다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라. # ```python # L = range(5) # print(type(L), L, list(L)) # print(type(L), L, list(L)) # # M = map(str, range(5)) # print(type(M), M, list(M)) # print(type(M), M, list(M)) # # N = list(map(str, range(5))) # print(type(N), N, list(N)) # print(type(N), N, list(N)) # ``` # ## Python 81 # ASCII 코드표의 32번 부터 127번 까지를 `chr`를 사용하여 다음과 같이 표현하여라. # ``` # | 032 | 064 @ | 096 ` | # | 033 ! | 065 A | 097 a | # | 034 " | 066 B | 098 b | # | 035 # | 067 C | 099 c | # | 036 $ | 068 D | 100 d | # | 037 % | 069 E | 101 e | # | 038 & | 070 F | 102 f | # | 039 ' | 071 G | 103 g | # | 040 ( | 072 H | 104 h | # | 041 ) | 073 I | 105 i | # | 042 * | 074 J | 106 j | # | 043 + | 075 K | 107 k | # | 044 , | 076 L | 108 l | # | 045 - | 077 M | 109 m | # | 046 . | 078 N | 110 n | # | 047 / | 079 O | 111 o | # | 048 0 | 080 P | 112 p | # | 049 1 | 081 Q | 113 q | # | 050 2 | 082 R | 114 r | # | 051 3 | 083 S | 115 s | # | 052 4 | 084 T | 116 t | # | 053 5 | 085 U | 117 u | # | 054 6 | 086 V | 118 v | # | 055 7 | 087 W | 119 w | # | 056 8 | 088 X | 120 x | # | 057 9 | 089 Y | 121 y | # | 058 : | 090 Z | 122 z | # | 059 ; | 091 [ | 123 { | # | 060 < | 092 \ | 124 | | # | 061 = | 093 ] | 125 } | # | 062 > | 094 ^ | 126 ~ | # | 063 ? | 095 _ | 127  | # ``` # ## Python 82 # 3개의 주사위를 던졌을 때 세 수의 합이 4의 배수인 경우를 나열하고, 그 경우의 수를 구하여라. # ## Python 83 # 3개의 주사위를 던졌을 때 세 수의 합이 짝수일 때, 세 수의 곱이 6의 배수일 확률을 기약분수로 표시하여라. # ## Python 84 # 숫자 `17131`에서 각 자리수에 사용된 `3`개의 수를 뽑으면 # $$111, 113, 117, 131, 137, 171, 173, 311, 317, 371, 711, 713, 731 $$ # 을 만들 수 있고, 이 중 가장 작은 수는 111이고, 가장 큰 수는 731입니다. # 이와 같이 숫자 `N`에서 자리에 사용된 `k`개의 수를 선택해서 가장 큰 수를 찾는 함수 `min_max(N, k)`를 작성하여라. # # ```python # >>> max_num(17131, 3) # (111, 731) # >>> min_max(8239823912, 5) # (12223, 99883) # ``` # ## Python 85 # `eval` 함수를 사용하여, 0부터 9까지의 숫자와 연산자 +, -, *, / 그리고 괄호는 소괄호 밖에 없는 수식이 제대로 연산이 되는지 판단하는 함수 `math`를 작성하여라. # # ```python # >>> math("3 + 5") # True # >>> math("5 + 7) * (3 * 5)") # False # ``` # ## Python 86 # 소괄호로 이루어진 문자열에서 괄호가 제대로 쌍을 이루고 있는지 판단하는 함수 `parentheses`를 작성하여라. # ```python # >>> parentheses("(()())()") # True # >>> parentheses("())()(()") # False # ``` # ## Python 87 # 초밥집의 초밥 레일에 N개의 접시가 있고, 가격이 붙어 있습니다. # 레일일 돌 때 비싼 접시에 있는 초밥부터 먹으려고 합니다. 동일한 가격이면 보이는 순서대로 먹습니다. # 먹은 초밥은 레일에서 치우고, 먹지 않은 초밥은 다른 것이 지나간 후에 다시 돌아옵니다. # # 예를 들어 레일에 다섯개의 접시 A, B, C, D, E, F가 있고, 각각의 초밥 가격이 5, 5, 3, 4, 1, 3인 경우에 A > B > D > F > C > E 를 먹게 된다. # 이 때 3번째의 접시 C의 초밥을 먹으려면 A, B, C, D, E, F 를 지나가고 나서 C 접시가 나올 때 먹게 되므로, 총 6개의 접시가 지나가야 합니다. # # 리스트 `L`에는 접시 순서대로 초밥 가격이 있다고 할 때, `n`번째 접시에 있는 초밥을 먹기 위해서는 몇 개의 접시가 지나가야 하는지 반환하는 함수 `sushi(L, n)`를 작성하여라. # # ```python # >>> sushi([5, 5, 3, 4, 1, 3], 3) # 6 # >>> sushi([1, 4, 3, 5, 4, 1], 1) # 10 # ``` # ## Python 88 # 핫도그 먹기 대회 정해진 시간이 끝난 후 음식을 먹은 핫도그 개수를 파악한 후 각 선수들의 등수를 매깁니다. # 리스트 `Name`에는 선수의 이름이, 리스트 `Point`에는 먹은 핫도그의 개수가 입력되어 있다고 할 때, 등수를 반환하는 함수 `ranking(Name, Point)`을 작성하여라. # (리스트 Name과 Point에는 선수들의 순서대로 입력되어 있으며, 같은 데이터는 없다.) # # ```python # >>> Name = ['손오공', '야모챠', '메지터', '비콜로'] # >>> Point = [70, 10, 55, 40] # >>> ranking(Name, Point) # {'손오공': 1, '메지터': 2, '비콜로': 3, '야모챠': 4} # ``` # ```python # >>> Name = ['홍길동', '엄석대', '연개소문', '김첨지'] # >>> Point = [2, 1, 10, 0] # >>> ranking(Name, Point) # {'연개소문': 1, '홍길동': 2, '엄석대': 3, '김첨지': 4} # ``` # ## Python 89 # 의약품 성분이 총 8개인 약품들이 있습니다. 예를들어 다음 데이터는 총 8개의 성분을 갖습니다. # # - 판콜비 = ABCDEFGH # - 넥타이레놀 = EFGHIJKL # # 예를 들어 성분이 ABCDEFGH인 약품에서 4개의 성분이 같은 약품은 EFGHIJKL, EFGHIJKM, EFGHIJKZ 등이 있으며, 4개 이상이 아니며 같은 요소가 정확히 4개인 것을 출력해야 합니다. (단, 제약 데이터의 성분은 중복이 될 수 없습니다. 예를 들어 'AAABBBAB'와 같은 데이터는 없습니다.) # # 특정 약품 `A`의 성분이 공개되었을 때, $n$개의 성분이 같은 약품 전부를 다음과 같이 랜덤으로 생선된 100개의 데이터 `DATA`에서 검색하여 출력하는 함수 `detection(DATA, A, n)`을 작성하여라. # ```python # >>> import random as r # >>> import string # >>> DATA = [''.join(r.sample(string.ascii_uppercase, 8)) for _ in range(100)] # >>> detection(DATA, 'ABCDEFGH', 4) # CBNZPETG # HBTFCJPR # HOAIVBEM # UPEZGHAX # RAIEHQVF # ``` # ## Python 90 # 다음을 실행해 보고 나오는 결과에 대해서 설명하여라. # ```python # a = sum([1, 2, 3, 4, 5, 6], 100) # print(a) # # b = sum([[1, 2], [3, 4], [5, 6]], [100]) # print(b) # ``` # ## Python 91 # 자연수 `n`과 `k`에 대하여 `n*(n-1)*(n-2)...*(n-k+1)`의 값을 반환하는 `perms(n, k)` 함수를 작성하여라. # (단, `math`모듈은 사용하지 않는다.) # ```python # >>> perms(100, 20) # 1303995018204712451095685346159820800000 # ``` # ## Python 92 # 1000 미만의 자연수 중 자리수의 합이 6의 배수인 것을 출력하고, 이 수들의 합을 구하여라. # ## Python 93 # `N`명의 사람을 `G`개의 조로 나눌 때, 각 조의 인원은 최대 1명 이하가 되도록 각 조의 인원을 출력하는 함수 `divide(N, G)`를 작성하여라. # ```python # >>> divide(56, 6) # [10, 10, 9, 9, 9, 9] # ``` # ## Python 94 # 자연수 `N`이 입력되면 `N`의 소인수분해를 출력하는 함수 `factor(N)`을 작성하여라. # ```python # >>> factor(544050) # 2 * 3^3 * 5^2 * 13 * 31 # ``` # ## Python 95 # 일정한 규칙을 가지고있는 숫자를 나열하는 놀이를 하는 중입니다. # - 처음에는 1을 적습니다. # - 이전 수에서 각 숫자의 갯수를 나타내어 숫자로 표시한다. 만약 이전 수가 `121`이라면 1이 2개, 2가 1개라서 1221을 작성한다. # # 이 규칙에 따르면 처음 몇 줄은 다음과 같이 된다. # 1. 1 → (1) # 2. 11 → (1이 1개) # 3. 12 → (1이 2개) # 4. 1121 → (1이 1개 2가 1개) # 5. 1321 → (1이 3개 2가 1개) # 6. 122131 → (1이 2개 2가 1개 3이 1개) # 7. 132231 → (1이 3개 2가 2개 3이 1개) # # 위와 같이 규칙으로 진행될 때, N번째까지 출력하는 함수 `seq(N)`을 작성하여라. # ```python # >>> seq(10) # 1 # 11 # 12 # 1121 # 1321 # 122131 # 132231 # 122232 # 112431 # 13213141 # ``` # ## Python 96 # 지도의 크기와 장애물의 위치, 캐릭터의 위치만 입력하면 게임 지형을 완성해주는 `make_map` 함수를 작성하여라. # - 가로와 세로의 크기 n과 m이 주어집니다. # - 지형의 테두리는 벽으로 이루어져 있습니다. # - 캐릭터가 있는 좌표가 배열형태로 주어집니다. # - 장애물이 있는 좌표가 2차원 배열 형태로 주어집니다. # - 지도는 n x m 크기의 배열이며 배열안의 값은 다음과 같이 3개로 구분되어 있습니다. # - 움직일수 있는 공간(0) # - 캐릭터(1) # - 벽(2) # # ```Python # >>> n = 4 # 가로 # >>> m = 5 # 세로 # >>> c = (0,0) # 캐릭터 위치 # >>> o = [(0,1),(1,1),(2,3),(1,3)] # 장애물 위치 # >>> world = make_map(n, m, c, o) # 지도 # ``` # ``` # [2, 2, 2, 2, 2, 2] # [2, 1, 2, 0, 0, 2] # [2, 0, 2, 0, 2, 2] # [2, 0, 0, 0 ,2, 2] # [2, 0, 0, 0, 0, 2] # [2, 0, 0, 0, 0, 2] # [2, 2, 2, 2, 2, 2] # ``` # ## Python 97 # 아래의 코드는 한 반에 30명인 학생, 총 7개의 반 점수가 '국어, 영어, 수학, 사회, 과학' 순서로 있는 다중 리스트를 랜덤한 값으로 만든 후, 다음 4가지의 값을 얻는다. # # 1. 반 점수 모두가 담긴 전교 점수 다중 리스트를 만들어주세요. # 2. 반 평균을 구하세요. # 3. 반 1등 점수를 구하세요. # 4. 전교 평균을 구하세요. # # ```python # import random as r # scores = [[[r.randint(1, 100) for _ in range(5)] for _ in range(30)] for _ in range(7)] # mean = lambda x: sum(x)/len(x) # # print("#1", scores) # print("#2", [mean([mean(s) for s in c]) for c in scores]) # print("#3", [max([mean(s) for s in c]) for c in scores]) # print("#4", mean([mean([mean(s) for s in c]) for c in scores])) # ``` # 위의 코드와 다르게 `numpy` 패키지를 이용한 방법으로 다시 코드를 만들어라. # ## Python 98 # 미국영어(American English)로 양의 정수를 표현할 때, 영문자 e 가 들어가지 않는 수를 `eban number` 라고 부른다. 예를 들어, 2 (two), 4(four), 6(six) 등은 eban number 이고, 1(one), 3(three), 5(five), 7(seven), 8(eight), 9(nine), 10(ten) 등은 eban number 가 아니다. # # 다음의 미국식 영어표현을 참조하여, eban number 를 크기 순으로 $100$개의 수를 출력하여라. # # 수 미국영어 # 1,000 thousand # 1,000,000 million # 1,000,000,000 billion # ## Python 99 # 양의 정수를 입력받아, 한글로 출력하는 함수 `inttohan`를 만들어라. # 예를 들어, 다음과 같이 실행되어야 한다. # ```python # >>> inttohan(0) # 영 # >>> inttohan(12105) # 만이천백오 # >>> inttohan(112050000) # 일억천이백오만 # >>> inttohan(2100010146) # 이십일억만백사십육 # >>> inttohan(21000000008900080000146) # 이백십해팔조구천억팔천만백사십육 # ```