written by Heesung Shin, Inha University, March 2023
다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라.
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))
range
를 사용하여 다음 리스트 L을 만들어라.
L = [2, 5, 8, 11, 14, 17]
pop
을 사용하여 리스트 L에서 11을 제거하여라.
L = [2, 5, 8, 11, 14, 17]
insert
를 사용하여 리스트 L에 100을 8과 14사이에 추가하여라.
L = [2, 5, 8, 14, 17]
리스트 L의 모든 원소의 평균 점수를 계산하여라.
L = [80, 75, 55, 70, 95]
input
을 사용하여 변수 n에 정수(int) 100을 입력받아 다음 L의 마지막에 추가하여라.
L = [80, 75, 55, 70, 95]
인하대학교 학번 12XXYYYY
에서 3번째와 4번째는 입학년도를 의미한다.
학생 A의 학번을 다음과 같이 변수 A_ID
에 저장하였다.
A_ID = '12345678'
이 변수로 부터 입학년도를 추출하여라.
range(1, 8, 2)
와 f-string을 사용하여 다음과 같이 출력되도록 코드를 완성하여라.
사과가 1개가 있다.
사과가 3개가 있다.
사과가 5개가 있다.
사과가 7개가 있다.
정수 524287
가 소수(prime number)인지 판별하는 코드를 완성하여라.
정수 239578885
를 소인수분해 하여라.
다음 입력에 대한 출력을 보고 무엇이 True
인지 확인하여라.
X = [None, 1, "", 0, bool(0)]
for x in X:
print(x, "\t", bool(x))
다음 중 변수명으로 사용할 수 없는 것이 무엇인지 확인하여라.
age = 1
a = 1
as = 1
_age = 1
1age = 1
나이 = 1
beautifulIsBetterThanUgly = 100
beautiful_is_better_than_ugly = 100 # prefer
딕셔너리를 다음과 같이 만들었다. 출력 값을 예측하고, weight
의 값을 100으로 변경하고, blood type
에 'RH+AB'를 추가하여라.
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']
sep
과 end
를 활용하여 다음 소스 코드를 완성하여 날짜와 시간을 2019/04/26 11:34:27
와 같이 출력되게 수정하여라.
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=" ")
for
문을 사용하여 (다음 예시와 같이) 입력된 수에 따라 크기가 정의된 크리스마스 트리 모양이 출력되는 프로그램을 작성하여라.
*
***
*****
*******
*********
공백으로 구분하여 두 숫자를 입력받아, 첫번째 숫자로 두번째 숫자를 나누었을 때, 그 몫과 나머지를 공백으로 구분하여 출력하세요.
10000 123
81 37
공백으로 구분하여 두 숫자 $a$와 $b$가 주어지면, $a$의 $b$제곱과 $b$의 $a$의 제곱의 합($=a^b+b^a$)의 값을 구하는 프로그램을 작성하세요
국어, 수학, 영어 시험을 보았습니다.
공백으로 구분하여 세 과목의 점수가 주어지면 전체 평균 점수
를 구하는 프로그램을 작성하세요. (단, 소숫점 이하는 모두 버립니다.)
20 30 40
30
$3$으로 나눈 나머지가 $2$인 $100$미만의 자연수를 모두 곱한 수의 값을 m
이라 할 때, 다음은 m
을 구하는 코드이다.
m = 1
for k in range(2, 100, 3):
m *= k
print(m)
위의 코드를 reduce
와 lamdba
을 사용하여 변경하여라.
$3$으로 나눈 나머지가 $2$인 $100$미만의 자연수를 모두 곱한 값의 각 자리수의 합을 s
라 할 때, 다음은 s
를 구하는 코드이다.
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을 사용하여 간단하게 변경하여라.
dir
은 대상 객체에 적용할 수 있는 method 를 모두 보여준다.
>>> 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의 차이를 설명하여라.
for s in ['123', '3²', '⅔', '12.3']:
print(s.isdecimal(), s.isdigit(), s.isnumeric(), )
우리 태양계를 이루고 있는 행성은 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성으로 총 8개 입니다.
수를 입력받아 그 순서에 해당하는 행성의 이름을 출력하는 코드를 완성하여라.
예를 들어, 3번째 행성은 지구입니다.
문장이 입력되면 거꾸로 출력하는 프로그램을 만들어 봅시다.
제 이름은 똑바로 읽어도 거꾸로 읽어도 우영우입니다. 기러기 토마토 스위스 인도인 별똥별 우영우
우영우 별똥별 인도인 스위스 토마토 기러기 .다니입우영우 도어읽 로꾸거 도어읽 로바똑 은름이 제
학기가 시작되고, 학생들이 돌아가면서 자기소개를 하기로 했습니다.
name = "홍길동"
age = 19
위와 같이 name과 age 두 변수가 주어지면 다음과 같이 출력하는 코드를 만들어 주세요.
안녕하세요. 제 이름은 홍길동이고 19살 입니다.
저는 19살인 홍길동입니다.
저는 홍길동이고 지금 19세 입니다.
이 때 첫번째, 두번째, 세번째 출력은 각각 formatting, format method, f-string 을 이용하세요.
딸기 게임을 합니다.
입력이 바나나 1
이면 () () () 바나나
를 출력하고,
입력이 사과 3
이면 () 사과 사과 사과
를 출력하는 코드를 완성하세요.
알파벳을 포함한 문장을 입력받아 그 중 대문자만 출력해주는 프로그램을 만들어보세요.
Python Is Powerful.
PIP
문장이 입력되면 각 단어별로 첫글자는 소문자, 나머지 글자는 대문자로 출력되는 코드를 만들어라.
I have NEVER beeN to Paris.
i hAVE nEVER bEEN tO pARIS.
6-gram
이란 문자열에서 6개의 연속된 요소를 출력하는 방법입니다.
예를 들어 'Wonderful'을 6-gram
으로 반복해 본다면 다음과 같은 결과가 나옵니다.
Wonder
onderf
nderfu
derful
입력으로 문자열이 주어지면 6-gram
으로 출력하는 프로그램을 작성해 주세요.
우리 태양계를 이루는 행성은 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성이 있습니다.
이 행성들의 영어 이름은 Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune입니다.
행성의 한글 이름을 입력하면 영어 이름을 반환하는 코드를 완성하여라.
(단, 태양계 안에 속하지 않은 행성의 경우에는 No value.
를 출력하여라.)
다음 소스 코드에서 세 부분의 pass
부분을 수정하여 다음과 같은 출력이 나오도록 클래스 작성을 완성하여라.
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.
원의 넓이는 반지름의 길이 X 반지름의 길이 X 3.14
입니다.
입력으로 원의 넓이가 주어진 반지름의 길이를 반환하는 함수 radius
를 만들어라.
>>> radius(63.585)
4.5
입력된 수 보다 작은 모든 소수를 갖는 리스트를 리턴값으로 가지는 함수 primes
를 작성하여라.
>>> primes(50)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
n번째 소수를 리턴하는 함수 nth_prime
을 만들어라.
>>> nth_prime(10)
29
주어진 L = [3, 8, 4, 2, 7]
의 각 원소에 대하여 nth_prime
함수값을 원소로 하는 리스트 [5, 19, 7, 3, 17]
를 만들어라.
학생들의 키(height)가 쉼표(comma)로 구분되는 문자열로 주어진다. 큰 학생부터 작은 학생 순서대로 작성되었는지 참/거짓을 확인하는 함수 height
를 작성하여라.
>>> height('156,155,165,169,166,176')
False
>>> height('176,169,166,165,156,155')
True
다음과 같이 첫번째 입력으로 문장이 주어지고 두번째 입력으로 찾을 단어가 주어지면, 그 단어가 시작하는 위치(index)를 반환하는 프로그램을 만들어라.
(단, 문장에 단어가 없는 경우에는 False
을 반환한다.)
pineapple is yummy
apple
4
첫 줄에는 학생의 이름이 공백으로 구분되어 입력되고, 두번째 줄에는 그 학생의 수학 점수가 공백으로 구분되어 주어진다.
zip
명령을 이용하여, 입력된 두 줄을 합쳐 학생의 이름이 key이고 그 학생의 점수가 value인 딕셔너리를 반환하여라.
Yujin Hyewon Gildong
70 100 80
{'Yujin': 70, 'Hyewon': 100, 'Gildong': 80}
다음과 같이 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 |
학생들이 선택한 후보들을 입력 받으면, 가장 많이 선택된 학생의 이름과 받은 표 수를 출력하는 프로그램을 작성하여라.
원범 원범 유진 혜원 유진 혜원 유진 유진
유진(이)가 총 4표로 반장이 되었습니다.
pass 부분을 수정하여 2제곱, 3제곱, 제곱근을 할 수 있는 함수를 반환하는 power
함수를 만들어라.
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]
문자열을 입력받으면 단어 수와 글자 수를 각각 출력하는 프로그램을 작성해 주세요.
저는 인하대학교 수학과 유진입니다
입력된 문장은 4 단어, 15 글자로 구성되어 있습니다.
한 줄에 여러 개의 숫자가 입력되면, 중앙에서 가까운 순서대로 출력하는 프로그램을 작성하시오.
(중간에서 동일한 거리에 있는 경우에는 앞쪽에 있는 것을 먼저 출력한다.)
5 6 4 7 3 8 2 9 1 10
3 8 7 2 4 9 6 1 5 10
$n$등이란 자기 보다 점수가 높은 학생의 수가 $n-1$ 명이 있다는 의미입니다.
학생들의 점수를 공백으로 구분하여 입력받아, 각 학생의 등수를 출력하세요.
94 86 75 94 55 94 85 97 94 97
3 7 9 3 10 3 8 1 3 1
미국에서는 QWERTY 라고 불리는 레이아웃을 가진 키보드를 사용하지만, 프랑스에서는 AZERTY라고 불리는 레이아웃을 가진 키보드를 사용합니다.
두 키보드의 배열은 대부분 같지만, A와 Q 그리고 Z와 W가 서로 위치가 바뀌어 있습니다.
maketrans
와 translate
메소드를 사용하여 문장이 입력되면 모든 A와 Q, Z와 W를 각각 서로 바꾸는 프로그램을 작성해 주세요.
Qzesome. Hello, my nqme is Hyezon.
Awesome. Hello, my name is Hyewon.
2040년 1월 1일은 일요일입니다.
datetime
모듈을 사용하여, 두 수 a와 b를 입력받아 2040년 a월 b일이 무슨 요일인지 리턴하는 함수 day_2040
을 완성하여라.
(단, 요일의 이름은 일요일부터 토요일까지 각각 SUN, MON, TUE, WED, THU, FRI, SAT 입니다.)
>>> day_2040(5, 24)
'THU'
python의 모듈 중 하나인 time 모듈
은 1970년 1월 1일 0시 0분 0초 이후로부터 지금까지 흐른 시간을 GMT 시간을 기준으로 초단위로 반환합니다.
다음 코드에서 변수 t
를 사용하여, 현재 시간을 한국표준시(GMT+9)로 변환하여 hh시 mm분 ss초
형태로 출력하여라.
from time import time
t = time()
사용자가 입력한 양의 정수의 각 자리수의 합을 출력해주세요.
1357924680
45
우리가 흔히 사용하는 숫자 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
어떤 놀이기구는 한 번에 타는 인원은 최대 5명이고, 제한 무게는 100kg로서, 최대인원 혹은 제한무게를 초과하면 무조건 다음 기구를 타야 합니다.
탑승할 친구들의 몸무게가 순서대로 주어질 때, 한 번에 탑승할 인원별로 몸무게로 나누어 표시하는 프로그램을 작성하세요.
50 40 20 20 10 55 50 30
1번째. (50, 40)
2번째. (20, 20, 10)
3번째. (55,)
4번째. (50, 30)
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
총 문자열의 길이는 50으로 제한하고 사용자가 문자열을 입력하면 그 문자열을 가운데 정렬을 해주고, 나머지 빈 부분에는 '#'을 채워넣어주세요
hello
######################hello#######################
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까지의 숫자가 각각 몇 개씩 사용되었는지 출력하세요.
공백으로 구분되는 자연수가 입력되었을 때, 이 자연수가 연속된 수들로만 구성된 것인지 아닌지 판별하고자 한다.
연속된 자연수로 구성되지 않은 경우에는 빠진 자연수를 출력하고, 연속된 자연수로 구성된 경우에는 True
를 출력하여라.
1 4 7 5 3
[2, 6]
인하대학교에서 주최하는 행사 접수를 위해 설문지를 배포하였습니다.
이름과 휴대폰 번호를 수집하였는데, 중복된 데이터들을 삭제하여 실제 접수 명단이 몇 명인지 알고 싶습니다.
휴대폰 번호를 키, 이름을 값으로 하는 딕셔너리로 변경하여, 실제 접수 인원을 확인하여라.
people = [
('이호준', '01050442903'),
('이호상', '01051442904'),
('이준호', '01050342904'),
('이준호', '01051239876'),
('이호준', '01050442903'),
('이준', '01050412904'),
('이호', '01050443904'),
('이호준', '01050442903'),
]
다음과 같이 국가 이름과 넓이의 자료가 딕셔너리가 주어졌다.
국가별로 한국과 넓이의 차를 값으로 딕셔너리를 만들고, 넓이의 차에 따른 순서에 따라 내림 차순으로 정렬하여 출력하여라.
(단, 넓이의 차는 항상 양수이고 한국은 출력하지 않는다.)
nationWidth = {
'Korea' : 220877,
'Rusia' : 17098242,
'China' : 9596961,
'France' : 543965,
'Japan' : 377915,
'England': 242900,
}
숫자를 입력 받아서 만단위로 콤마(,)가 찍힌 문자열로 변환하여라.
1234567890
12,3456,7890
하노이의 탑은 프랑스 수학자 에두아르드가 처음으로 발표한 게임입니다. 하노이의 탑은 A, B, C 3개의 기둥과 기둥에 꽂을 수 있는 N개의 원판으로 이루어져 있습니다. 이 게임에서 다음의 규칙을 만족해야 합니다.
- 처음에 모든 원판은 A기둥에 꽂혀 있다.
- 모든 원판의 지름은 다르다.
- 이 원반은 세 개의 기둥 중 하나에 반드시 꽂혀야 한다.
- 작은 원반 위에 큰 원반을 놓을 수 없다.
- 한 번에 하나의 원판(가장 위에 있는 원판) 만을 옮길 수 있다.
이 규칙을 만족하며 A기둥에 있는 원반 N개를 모두 C 원반으로 옮기고 싶습니다.
*ARGS1
, *ARGS2
, *ARGS3
부분을 수정하여, 최소한의 이동으로 모든 원반을 옮기기 위한 방법을 제시하는 프로그램을 완성하여라.
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.
이름을 가나다 순서대로 나열하여 번호를 매기려고 합니다.
enumerate
를 활용하여 코드에 입력된 이름을 아래와 같이 출력해주세요.
student = [
'강은지', '김유정', '박현서',
'최성훈', '홍유진', '박지호',
'권윤일', '김채리', '한지호',
'김진이', '김민호', '강채연',
]
번호. 1 / 이름. 강은지
번호. 2 / 이름. 강채연
번호. 3 / 이름. 권윤일
번호. 4 / 이름. 김민호
번호. 5 / 이름. 김유정
번호. 6 / 이름. 김진이
번호. 7 / 이름. 김채리
번호. 8 / 이름. 박지호
번호. 9 / 이름. 박현서
번호. 10 / 이름. 최성훈
번호. 11 / 이름. 한지호
번호. 12 / 이름. 홍유진
완전 거듭제곱(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 이하의 모든 완전 거듭제곱을 출력하여라.
완전 거듭제곱의 집합을 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$$
'복잡한 세상 편하게 살자' 라는 문장을 '복세편살'로 줄여 말하는 것처럼, 어떤 입력이 주어지면 띄어쓰기를 기준으로 앞 글자만 줄여 출력하여라.
복잡한 세상 편하게 살자
복세편살
아래 기준을 만족하면서 20390923
을 출력하는 코드를 작성하세요
문자열을 입력받으면 순서를 유지한 채 중복된 자료를 제거하여라. (단, 딕셔너리의 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
다음과 같이 길이가 같은 두 개의 리스트가 정의되었다.
A = ['1', '2', '3', '4']
B = ['a', 'b', 'c', 'd']
위의 두 변수를 활용하여 [['1', 'a'], ['b', '2'], ['3', 'c'], ['d', '4']]
와 같이 두 리스트의 원소를 쌍으로 결합하되 쌍의 순서가 번갈아 등장하도록 출력하여라.
정량 N에 정확히 맞춰야만 움직이는 이상한 화물용 엘레베이터가 있습니다.
화물 포장은 7kg, 3kg 두 가지이며, 엘레베이터를 움직이기 위해 포장된 화물의 개수를 최대한 적게 사용하고 싶습니다.
예를 들어 화물 정량이 24kg이라면 3kg 화물 8개를 옮기는 것 보다는 7kg 화물 3개와 3kg 화물 1개, 즉 4개의 화물을 옮기는 것이 효율적입니다.
엘레베이터 정량 N이 입력되었을 때, 가장 적게 필요한 화물을 출력하여라. 만약 어떻게 해도 정량이 N이 되지 않는다면 False
를 출력하여라.
24
[(7, 3), (3, 1)]
블럭은 알파벳 대문자로 표시하고, 이 블럭으로 탑을 쌓는 순서는 문자열로 표시합니다.
쌓는 규칙 역시 문자열로 표시됩니다.
규칙에서 어떤 두 블럭을 선택하더라도 탑에서 그 순서가 유지 되면 탑이 무너지지 않습니다.
예를 들면 규칙이 BAC
라면
탑 BDADBDCCD
는 3번째 A와 5번째 B가 규칙을 만족하지 않으므로 탑은 무너지고,
탑 BDADADCCD
는 규칙을 만족하고 탑은 무너지지 않습니다.
규칙을 첫번째 입력하고, 탑은 두번째에 공백을 기준으로 입력할 때, 각각의 탑에 대하여 무너지지 않으면 True
, 무너지면 False
를 출력하여라.
ABCD
ABCDEF BCAD ADEFQRX BEDFG AEBFDGCH
True False True True False
광장에서 모인 사람들과 악수를 하는 행사가 열렸다.
악수는 1대 1로 진행되었으며, 인철이는 몇 명의 사람들과 악수를 한 후 중간에 일이 생겨 집으로 갔다.
(인철이는 최소 1번 악수를 했으며, 집에 가기 전에 모두와 악수를 했을 수도 있다.)
인철이를 제외한 모든 참가자는 행사가 끝날 때 까지 참석하면서, 남아 있는 모든 참가자와 한 번씩 악수를 했다.
이 때 같은 상대와 중복된 악수가 없었고, 진행된 악수는 총 $n$ 번이라고 하자.
인철이가 악수한 횟수와 전체 행사참가자 수를 구하는 함수 solve
를 작성하여라.
예를 들어 59회의 악수가 행사에서 진행되었다고 하면, 인철이를 포함한 전체 행사참가자는 12명이고, 인철이는 4번의 악수 후 집으로 돌아갔다.
>>> solve(59)
(12, 4)
버스시간표와 현재 시간이 주어졌을 때 버스 도착 시간이 얼마나 남았는지 알려주는 함수 notice
를 작성하여라.
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분 남음']
골드바흐의 추측
(Goldbach's conjecture
)은 오래전부터 알려진 정수론의 미해결 문제로,
2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것이다.
이때 하나의 소수를 두 번 사용하는 것은 허용한다. - 위키백과
위 설명에서 2보다 큰 모든 짝수를 두 소수의 합으로 나타낸 것을 골드바흐 분할이라고 합니다.
2보다 큰 짝수 n이 주어졌을 때, 골드바흐 분할 $(a,b)$를 모두 출력하는 함수 Goldbach
를 작성하여라. (단, $a\leq b$)
>>> Goldbach(122)
[(13, 109), (19, 103), (43, 79), (61, 61)]
행렬 2개가 주어졌을 때 곱할 수 있는 행렬인지 확인하고 곱할 수 있다면 그 결과를, 곱할 수 없다면 False
를 출력하는 함수 mul
을 작성하여라.
(단, 라이브러리는 사용을 하지 않습니다.)
>>> X = [[1, 2, 3],
... [4, 5, 6],]
>>> Y = [[1, 2],
... [3, 4],
... [5, 6],]
>>> mul(X, Y)
[[22, 28], [49, 64]]
다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라.
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)
다음 코드를 실행하여 결과를 확인하고, 문제점을 지적하고, 첫 줄을 변경하여 문제점을 해결하여라.
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)
문자열을 입력받아 다음과 같이 연속되는 문자열을 압축해서 표현하고 싶습니다.
aaabbccccccasss
a3b2c6a1s3
369 게임
을 하는데 조금 이상한 규칙이 있습니다. 3이나 6, 9 로만 이루어진 수일 때만 박수를 쳐야합니다.
예를 들어 13, 16과 같이 3과 6, 9 만으로 숫자가 아닐 경우엔 박수를 치지 않습니다.
현재 36일 때 36 이전까지 박수를 친 것은 3, 6, 9, 33 으로 총 4번입니다.
숫자를 입력하면 그 숫자 이전까지 박수를 친 번호를 출력하는 함수 clap
을 완성하여라.
>>> clap(65)
[3, 6, 9, 33, 36, 39, 63]
지뢰를 제거하기 위해 수색반을 투입합니다. 수색반은 도시를 격자 무늬로 나눠놓고 자신들이 수색할 수 있는 범위 내에 가장 많은 지뢰가 매립된 지역을 가장 먼저 작업하고 싶습니다.
N x N
입니다.L
에 표시합니다. 0은 지뢰가 없음 1은 지뢰가 있음을 뜻합니다.수색 가능한 범위 N x N
내에서 찾아낼 수 있는 가장 큰 지뢰의 개수를 구하는 함수 max_mine
을 작성하여라.
>>> 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
깃발 주위에는 동서남북 방향으로 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
부분문자열(Subsequence)이란 어떤 문자열에서 연속되어 나열되어 있는 문자열을 말합니다.
공통 부분문자열(Common Subsequence)이란 두 문자열에서 공통으로 들어 있는 부분문자열을 말합니다.
가장 긴 공통 부분문자열
(Longest Common Subsequence)이란 두 문자열이 주어졌을 때 이들의 공통 부분문자열 중 가장 긴 것을 말합니다.
예를 들어 S1 = 'THISISSTRINGS' S2 = 'THISIS'라는 두 문자열이 있을 때 둘 사이의 부분 공통 문자열의 길이는 'THISIS'의 6개가 됩니다.
이처럼 두 문자열이 주어지면 가장 긴 부분 공통 문자열의 길이를 반환하는 함수 LCS
를 만들어 주세요.
이 두 문자열에 가장 긴 부분 공통 문자열
이 여러 개 존재할 수 있으므로 모두 모아 리스트 형태로 반환하면 됩니다.
>>> S = 'THISISSTRINGS'
>>> T = 'KIOTHISKESSISSKTKKQQAEW'
>>> LCS(S,T)
['THIS', 'SISS']
중국집에 원형테이블 위에 시계방향으로 1번 음식 부터 N번 음식까지 있습니다.
한 개의 음식을 먹고 나서 다 먹은 음식의 접시는 치우고 시계방향으로 K번째 음식을 먹습니다.
처음에 1번 음식을 먹기 시작하고, 마지막에 2개의 음식을 남긴다고 할 때, 마지막에 남는 음식을 출력하는 함수 food(N, K)
를 작성하여라.
예를 들어, N=7
, K=4
인 경우에 1 > 5 > 3 > 2 > 4 번호 순서로 음식을 먹고, 6과 7의 접시가 남습니다.
>>> food(7, 4)
[6, 7]
리스트의 순회는 맨 뒤의 원소를 맨 앞으로 옮기는 것 입니다.
예를 들어 리스트 L
을 2번 순회하면 리스트 M
이 되고, 두 리스트 L
과 M
의 원소별 차이는 다음과 같습니다.
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)
을 작성하여라.
>>> L = [25, 27, 34, 35, 39, 10, 20]
>>> n = 2
>>> cycle(L, n)
[4, (39, 34), 5]
조합
이란 원소들을 조합하여 만들 수 있는 경우의 수이며 원소의 순서는 신경쓰지 않습니다.
문자열 s
에서 사용된 영문 대문자 중 n
개를 선택하여 나올 수 있는 모든 조합과 그 수를 출력하는 함수 comb(s, n)
를 itertools
모듈을 사용하여 작성하여라.
>>> 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']
다음 코드를 실행하여 결과를 확인하고, 그 결과에 대해 설명하여라.
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))
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 |
3개의 주사위를 던졌을 때 세 수의 합이 4의 배수인 경우를 나열하고, 그 경우의 수를 구하여라.
3개의 주사위를 던졌을 때 세 수의 합이 짝수일 때, 세 수의 곱이 6의 배수일 확률을 기약분수로 표시하여라.
숫자 17131
에서 각 자리수에 사용된 3
개의 수를 뽑으면
$$111, 113, 117, 131, 137, 171, 173, 311, 317, 371, 711, 713, 731 $$
을 만들 수 있고, 이 중 가장 작은 수는 111이고, 가장 큰 수는 731입니다.
이와 같이 숫자 N
에서 자리에 사용된 k
개의 수를 선택해서 가장 큰 수를 찾는 함수 min_max(N, k)
를 작성하여라.
>>> max_num(17131, 3)
(111, 731)
>>> min_max(8239823912, 5)
(12223, 99883)
eval
함수를 사용하여, 0부터 9까지의 숫자와 연산자 +, -, *, / 그리고 괄호는 소괄호 밖에 없는 수식이 제대로 연산이 되는지 판단하는 함수 math
를 작성하여라.
>>> math("3 + 5")
True
>>> math("5 + 7) * (3 * 5)")
False
소괄호로 이루어진 문자열에서 괄호가 제대로 쌍을 이루고 있는지 판단하는 함수 parentheses
를 작성하여라.
>>> parentheses("(()())()")
True
>>> parentheses("())()(()")
False
초밥집의 초밥 레일에 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)
를 작성하여라.
>>> sushi([5, 5, 3, 4, 1, 3], 3)
6
>>> sushi([1, 4, 3, 5, 4, 1], 1)
10
핫도그 먹기 대회 정해진 시간이 끝난 후 음식을 먹은 핫도그 개수를 파악한 후 각 선수들의 등수를 매깁니다.
리스트 Name
에는 선수의 이름이, 리스트 Point
에는 먹은 핫도그의 개수가 입력되어 있다고 할 때, 등수를 반환하는 함수 ranking(Name, Point)
을 작성하여라.
(리스트 Name과 Point에는 선수들의 순서대로 입력되어 있으며, 같은 데이터는 없다.)
>>> Name = ['손오공', '야모챠', '메지터', '비콜로']
>>> Point = [70, 10, 55, 40]
>>> ranking(Name, Point)
{'손오공': 1, '메지터': 2, '비콜로': 3, '야모챠': 4}
>>> Name = ['홍길동', '엄석대', '연개소문', '김첨지']
>>> Point = [2, 1, 10, 0]
>>> ranking(Name, Point)
{'연개소문': 1, '홍길동': 2, '엄석대': 3, '김첨지': 4}
의약품 성분이 총 8개인 약품들이 있습니다. 예를들어 다음 데이터는 총 8개의 성분을 갖습니다.
예를 들어 성분이 ABCDEFGH인 약품에서 4개의 성분이 같은 약품은 EFGHIJKL, EFGHIJKM, EFGHIJKZ 등이 있으며, 4개 이상이 아니며 같은 요소가 정확히 4개인 것을 출력해야 합니다. (단, 제약 데이터의 성분은 중복이 될 수 없습니다. 예를 들어 'AAABBBAB'와 같은 데이터는 없습니다.)
특정 약품 A
의 성분이 공개되었을 때, $n$개의 성분이 같은 약품 전부를 다음과 같이 랜덤으로 생선된 100개의 데이터 DATA
에서 검색하여 출력하는 함수 detection(DATA, A, n)
을 작성하여라.
>>> 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
다음을 실행해 보고 나오는 결과에 대해서 설명하여라.
a = sum([1, 2, 3, 4, 5, 6], 100)
print(a)
b = sum([[1, 2], [3, 4], [5, 6]], [100])
print(b)
자연수 n
과 k
에 대하여 n*(n-1)*(n-2)...*(n-k+1)
의 값을 반환하는 perms(n, k)
함수를 작성하여라.
(단, math
모듈은 사용하지 않는다.)
>>> perms(100, 20)
1303995018204712451095685346159820800000
1000 미만의 자연수 중 자리수의 합이 6의 배수인 것을 출력하고, 이 수들의 합을 구하여라.
N
명의 사람을 G
개의 조로 나눌 때, 각 조의 인원은 최대 1명 이하가 되도록 각 조의 인원을 출력하는 함수 divide(N, G)
를 작성하여라.
>>> divide(56, 6)
[10, 10, 9, 9, 9, 9]
자연수 N
이 입력되면 N
의 소인수분해를 출력하는 함수 factor(N)
을 작성하여라.
>>> factor(544050)
2 * 3^3 * 5^2 * 13 * 31
일정한 규칙을 가지고있는 숫자를 나열하는 놀이를 하는 중입니다.
121
이라면 1이 2개, 2가 1개라서 1221을 작성한다.이 규칙에 따르면 처음 몇 줄은 다음과 같이 된다.
위와 같이 규칙으로 진행될 때, N번째까지 출력하는 함수 seq(N)
을 작성하여라.
>>> seq(10)
1
11
12
1121
1321
122131
132231
122232
112431
13213141
지도의 크기와 장애물의 위치, 캐릭터의 위치만 입력하면 게임 지형을 완성해주는 make_map
함수를 작성하여라.
>>> 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]
아래의 코드는 한 반에 30명인 학생, 총 7개의 반 점수가 '국어, 영어, 수학, 사회, 과학' 순서로 있는 다중 리스트를 랜덤한 값으로 만든 후, 다음 4가지의 값을 얻는다.
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
패키지를 이용한 방법으로 다시 코드를 만들어라.
미국영어(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
양의 정수를 입력받아, 한글로 출력하는 함수 inttohan
를 만들어라.
예를 들어, 다음과 같이 실행되어야 한다.
>>> inttohan(0)
영
>>> inttohan(12105)
만이천백오
>>> inttohan(112050000)
일억천이백오만
>>> inttohan(2100010146)
이십일억만백사십육
>>> inttohan(21000000008900080000146)
이백십해팔조구천억팔천만백사십육