나는 무엇이든 공부할 때
이론은 최대한 짧고 간결하게 훑어보고 바로 문제를 풀어본다.
당연히 많이 틀리지만, 해설에 나와있는 개념을 공부한 후 그것과 관련된 이론을 공부하는 것이 경험 상 기억에 더 오래 남았던 것 같다.
Python 문법도 오랜 기간 코딩을 손 놓고 있다가 다시 보면 어떤 문법이 있었는지 가물가물할 때가 있다...
그때마다 위키독스에 '초보자를 위한 파이썬 300제'나 부트캠프에서 풀었던 예제 문제들을 풀어보면서 복기했다.
'이런 문법이 있었지'하고 복기만 하면 되어서 그냥 넘기면 되는 문제들도 꽤나 많아서, 이번에 필요한 문제들만 따로 모아서 정리하고자 한다.
(기초 문법 전체가 아니라 나에게 필요한 문법 문제들만 모아놓음)
문제들은 위키독스 '초보자를 위한 파이썬 300제'와 LG U+ Why not SW camp 부트캠프에서 조준우 강사님께서 다루었던 문제들로 구성되어 있다.
#1
print() 함수를 사용하여 다음과 같이 출력하세요.
naver;kakao;sk;samsung
답:
print("naver","kakao","samsung", sep=';')
print 함수의 `sep` 인자로 ";"를 입력하면 출력되는 값들 사이에 한 칸의 공백대신 세미콜론이 출력됩니다.
#2
다음 코드를 수정하여 줄바꿈이 없이 출력하세요.
print("first")
print("second")
답:
print("first",end='')
print("second")
- `print()`함수는 출력 후 자동 줄바꿈을 한다
- `end=`는 출력 마지막에 붙일 문자열을 담당 (기본 : `end=\n`)
- `\n` 대신 다른 문자를 넣을 수 있다. 줄바꿈 대신 들어감.
#3
다음 예시처럼 문자열을 거꾸로 뒤집어 출력하세요.
>> string = "PYTHON"
실행 예:
NOHTYP
답:
string = "PYTHON"
string[-1::-1]
#4
아래의 전화번호에서 하이푼 ('-')을 제거하고 아래와 같이 모두 붙여 출력하세요.
>> phone_number = "010-1111-2222"
실행 예:
01011112222
답:
phone_number = "010-1111-2222"
phone_number2 = phone_number.replace("-","")
phone_number2
- `.replace(기존문자, 새 문자)` : 문자열의 일부를 치환할 수 있다.
- 문자열은 수정할 수 없는 자료형이다.
- 기존 문자열은 그대로 두고 치환된 새로운 문자열이 리턴된다.
- 한 번 만들어진 문자열 객체는 그 내부의 문자 값을 바꿀 수 없어 그 문자열이 통으로 저장된다. 즉, 문자열의 일부 문자만 바꾸는 것이 불가능하다.
- replace() 시 바꾸는 것처럼 보이지만 항상 새로운 문자열을 생성하고 있는 것이다.
#5
url 에 저장된 웹 페이지 주소에서 도메인을 출력하세요.
>> url = "http://sharebook.kr"
실행 예:
kr
답:
url = "http://sharebook.kr"
url_split = url.split(".")
url_split[1]
- `.split()` : () 안 문자를 기준으로 문자열을 분리한다. 분리 후 리스트로 저장됨
#6
변수에 다음과 같이 문자열과 정수가 바인딩되어 있을 때 % formatting을 사용해서 다음과 같이 출력해보세요.
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
출력 예:
이름: 김민수 나이: 10
이름: 이철희 나이: 13
답:
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
# %formatting
print("이름 : %s 나이 : %d" % (name1, age1))
print("이름 : %s 나이 : %d" % (name2, age2))
print 포맷팅에서 `%s`는 문자열 데이터 타입의 값을 `%d`는 정수형 데이터 타입 값의 출력을 의미합니다.
#7
문자열의 format( ) 메서드를 사용해서 #6번 문제를 다시 풀어보세요.
답:
# format() 메서드
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
print("이름: {} 나이: {}".format(name1, age1))
print("이름: {} 나이: {}".format(name2, age2))
#8
파이썬 3.6부터 지원하는 f-string을 사용해서 #6번 문제를 다시 풀어보세요.
답:
name1 = "김민수"
age1 = 10
name2 = "이철희"
age2 = 13
print(f"이름: {name1} 나이: {age1}")
print(f"이름: {name2} 나이: {age2}")
#9
문자열의 좌우의 공백 또는 등호가 있을 때 이를 제거해보세요.
1. 공백 앞뒤 제거
2. 등호 앞뒤 제거
3. 왼쪽 등호만 제거
4. 오른족 등호만 제거
data_space = " 삼성전자 "
data_equal = "=====삼성전자====="
답:
data_space = " 삼성전자 "
data_equal = "=====삼성전자====="
print(data_space.strip(" "))
print(data_equal.strip("="))
print(data_equal.lstrip("="))
print(data_equal.rstrip("="))
- `.strip()` : 좌우의 공백을 제거할 수 있다. 특정 문자를 제거할 수 도 있음.
#10
다음과 같은 문자열이 있을 때 이를 대문자 BTC_KRW로 변경하세요.
ticker = "btc_krw"
답:
ticker = "btc_krw"
ticker.upper()
- `.upper()` : 문자열을 대문자로 만듦. 이 경우도 원본 문자열은 유지되고 대문자로 변경된 새로운 문자열 객체가 반환됨. 특정 알파벳만 바꾸는 것 불가능. 전체 다 적용됨.
#11
다음과 같은 문자열이 있을 때 이를 대문자 BTC_KRW로 변경하세요.
ticker = "BTC_KRW"
답:
ticker = "BTC_KRW"
ticker.lower()
- `.lower()` : 문자열을 통째로 소문자로 만듦
#12
문자열 'hello'가 있을 때 이를 'Hello'로 변경해보세요.
답:
string = 'hello'
string.capitalize()
#13
파일 이름이 문자열로 다음과 같이 저장되어 있을 때 파일 이름이 'xlsx' 또는 'xls'로 끝나는지 확인해보세요.
file_name = "보고서.xlsx"
답:
file_name = "보고서.xlsx"
file_name.endswith(("xlsx","xls"))
- `endswith("문자열")` : ends+with으로 "문자열"로 끝나는지 아닌지를 true/false로 알 수 있다.
- endswith(튜플)로 여러개의 문자열 중 하나로 끝나는지 확인도 가능.
- 리스트는 안됨
#14
파일 이름이 문자열로 다음과 같이 저장되어 있을 때 파일 이름이 '2020'로 시작하는지 확인해보세요.
file_name = "2020_보고서.xlsx"
답:
file_name = "2020_보고서.xlsx"
file_name.startswith("2020")
- `startswith("문자열")` : starts+with로 "문자열"로 시작하는지 아닌지를 true/false로 판별
#15
movie_rank 리스트에는 아래와 같이 네 개의 영화 제목이 바인딩되어 있다. "슈퍼맨"을 "닥터 스트레인지"와 "스플릿" 사이에 추가하라.
movie_rank = ['닥터 스트레인지', '스플릿', '럭키', '배트맨']
답:
movie_rank = ['닥터 스트레인지', '스플릿', '럭키', '배트맨']
movie_rank.insert(1,'슈퍼맨')
movie_rank
- `.insert(인덱스, 원소)` : 해당 인덱스 위치에 원소 추가 가능
#16
movie_rank 리스트에서 '럭키'를 삭제하라.
movie_rank = ['닥터 스트레인지', '슈퍼맨', '스플릿', '럭키', '배트맨']
답:
movie_rank = ['닥터 스트레인지', '슈퍼맨', '스플릿', '럭키', '배트맨']
# movie_rank.remove('럭키')
del movie_rank[3]
movie_rank
- 리스트에서 원소 삭제
- `del 리스트명[인덱스]` : [슬라이싱] 가능
- `.remove()` : () 안 원소 하나만 가능
- `.pop(인덱스)` : 인덱스 생략 시 마지막 요소 반환 후 삭제
- 리스트에서 어떤 값을 삭제하면 남은 값들은 새로 인덱싱된다. 어떤 값이 먼저 삭제된 후 남은 원소들에 대해서 순서를 새로 고려한 후 삭제해야 함.
#17
interest 리스트에는 아래의 데이터가 바인딩되어 있다.
interest = ['삼성전자', 'LG전자', 'Naver', 'SK하이닉스', '미래에셋대우']
interest 리스트를 사용하여 아래와 같이 화면에 출력하라.
출력 예시:
삼성전자/LG전자/Naver/SK하이닉스/미래에셋대우
답:
interest = ['삼성전자', 'LG전자', 'Naver', 'SK하이닉스', '미래에셋대우']
"/".join(interest)
- `"연결부에 들어갈 문자".join(리스트)`
#18
리스트에 있는 값을 오름차순으로 정렬하세요.
data = [2, 4, 3, 1, 5, 10, 9]
답:
data = [2, 4, 3, 1, 5, 10, 9]
# data.sort()
data2 = sorted(data)
data2
- 데이터 오름차순 정렬하기
- `data.sort()`
- `sorted(data)`
#19
1 부터 99까지의 정수 중 짝수만 저장된 튜플을 생성하라.
(2, 4, 6, 8 ... 98)
답:
even = tuple(range(2,100,2))
even
- `range(처음, 끝, step)` : 범위를 step에 맞춰 순차적으로 나열. 리스트로 출력됨.
#20
1. 다음과 같이 10개의 값이 저장된 scores 리스트가 있을 때, start expression을 사용하여 좌측 8개의 값을 valid_score 변수에 바인딩하여라.
scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
답:
scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
*valid_score, a, b = scores
print(valid_score)
2. 우측 8개의 값을 valid_score 변수에 바인딩하여라.
답:
scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
a, b, *valid_score = scores
print(valid_score)
3. 가운데 있는 8개의 값을 valid_score 변수에 바인딩하여라.
답:
scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
a, *valid_score, b = scores
print(valid_score)
#21
다음 아이스크림 이름과 희망 가격을 딕셔너리로 구성하라.

답:
price = {
'메로나': 1000,
'폴라포': 1200,
'빵빠레': 1800
}
print(price, type(price))
#22
1. 다음 딕셔너리를 사용하여 메로나 가격을 출력하라.
ice = {'메로나': 1000, '폴로포': 1200, '빵빠레': 1800, '죠스바': 1200, '월드콘': 1500}
실행 예:
메로나 가격: 1000
답:
ice = {'메로나': 1000,
'폴로포': 1200,
'빵빠레': 1800,
'죠스바': 1200,
'월드콘': 1500}
print(f"메로나 가격 : {ice['메로나']}")
2. 메로나의 가격을 1300으로 수정하라.
답:
ice['메로나'] = 1300
ice
3. 다음 딕셔너리에서 메로나를 삭제하라.
답:
del ice['메로나']
ice
- 딕셔너리에서 추가/ 삭제
- 추가
- `딕셔너리['key'] = '값'`
- 삭제
- `del 딕셔너리['key']`
- `.pop('key')` : 키와 대응되는 값을 꺼내고 변수에 할당 가능. 리스트에서는 삭제됨.
#23
1. 다음의 딕셔너리로부터 key 값으로만 구성된 리스트를 생성하라.
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
답:
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
ice = list(icecream.keys())
ice
2. values 값으로만 구성된 리스트를 생성하라.
답:
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
ice_values = list(icecream.values())
ice_values
#24
아래의 new_product 딕셔너리를 다음 icecream 딕셔너리에 추가하라.
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
new_product = {'팥빙수':2700, '아맛나':1000}
답:
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
new_product = {'팥빙수':2700, '아맛나':1000}
icecream.update(new_product)
icecream
#25
아래 두 개의 튜플을 하나의 딕셔너리로 변환하라. keys를 키로, vals를 값으로 result 이름의 딕셔너리로 저장한다.
keys = ("apple", "pear", "peach")
vals = (300, 250, 400)
실행 예시:
>> print(result)
{'apple': 300, 'pear': 250, 'peach': 400}
답:
keys = ("apple", "pear", "peach")
vals = (300, 250, 400)
result = dict(zip(keys,vals))
result
#26
사용자로부터 하나의 값을 입력받은 후 해당 값에 20을 뺀 값을 출력하라. 단 출력 값의 범위는 0~255이다. 예를 들어 결괏값이 0보다 작은 값이되는 경우 0을 출력하고 255보다 큰 값이 되는 경우 255를 출력해야 한다.
>> 입력값: 200
출력값: 180
>> 입력값: 15
출력값: 0
답:
user = int(input("입력값 : "))
num = user - 20
if num < 0 :
print("출력값 : 0")
elif 255 < num :
print("출력값 : 255")
else:
print(f"출력값 : {num}")
- input() : 사용자에게 입력받은 값은 string으로 저장된다.
#27
사용자로부터 입력 받은 시간이 정각인지 판별하라.
>> 현재시간:02:00
정각 입니다.
>> 현재시간:03:10
정각이 아닙니다
답:
user = input("현재 시간 : ")
time = user[-2:]
if time == '00' :
print("정각 입니다.")
else:
print("정각이 아닙니다.")
#28
아래와 같이 fruit 딕셔너리가 정의되어 있다. 사용자가 입력한 값이 딕셔너리 키 (key) 값에 포함되었다면 "정답입니다"를 아닐 경우 "오답입니다" 출력하라.
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
>> 제가좋아하는계절은: 봄
정답입니다.
답:
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
user = input("제가좋아하는계절은: ")
if user in fruit:
print("정답입니다.")
else:
print("오답입니다.")
#29
아래와 같이 fruit 딕셔너리가 정의되어 있다. 사용자가 입력한 값이 딕셔너리 값 (value)에 포함되었다면 "정답입니다"를 아닐 경우 "오답입니다" 출력하라.
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
>> 좋아하는과일은? 한라봉
오답입니다.
답:
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
user = input("좋아하는 과일은?")
if user in fruit.values():
print("정답입니다.")
else:
print("오답입니다.")
#30
사용자로부터 문자 한 개를 입력 받고, 소문자일 경우 대문자로, 대문자 일 경우, 소문자로 변경해서 출력하라.
>> a
A
답:
user = input("")
if user.islower():
print(user.upper())
else:
print(user.lower())
#31
파일 이름이 저장된 리스트에서 확장자가 .h나 .c인 파일을 화면에 출력하라.
리스트 = ['intra.h', 'intra.c', 'define.h', 'run.py']
답:
리스트 = ['intra.h', 'intra.c', 'define.h', 'run.py']
for 변수 in 리스트:
split = 변수.split(".")
if (split[1] == "h") or (split[1] == "c"):
print(변수)
#32
다음과 같이 출력하시오.
##################################################
Python : Guido van Rossum
C++ : Bjarne Stroustrup
Java : Jame Gosling
Pascal : Niklaus Wirth
##################################################
##################################################
Python: Guido van Rossum
C++: Bjarne Stroustrup
Java: Jame Gosling
Pascal: Niklaus Wirth
##################################################
python = "Python"
C = "C++"
java="Java"
pascal="Pascal"
p_name="Guido van Rossum"
c_name="Bjarne Stroustrup"
j_name="Jame Gosling"
pa_name="Niklaus Wirth"
답:
s="#"
python = "Python"
C = "C++"
java="Java"
pascal="Pascal"
p_name="Guido van Rossum"
c_name="Bjarne Stroustrup"
j_name="Jame Gosling"
pa_name="Niklaus Wirth"
print(s*50)
py=print(python,p_name,sep=" : ")
cc=print(C,c_name,sep=" : ")
ja=print(java,j_name,sep=" : ")
pa=print(pascal,pa_name,sep=" : ")
print(s*50, '\n'*2)
print(s*50)
print('{:>6}: {}'.format(python,p_name))
print('{:>6}: {}'.format(C,c_name))
print('{:>6}: {}'.format(java,j_name))
print('{:>6}: {}'.format(pascal,pa_name))
print(s*50, '\n'*2)
print(s*50)
print(f'{python:>7} : {p_name}')
print(f'{C:>7} : {c_name}')
print(f'{java:>7} : {p_name}')
print(f'{pascal:>7} : {pa_name}')
print(s*50, '\n'*2)
### 정렬

#33
사용자로부터 숫자 10을 입력 받고 그 숫자가 0이 될 때까지 숫자와 반복 번수를 출력하세요. 만약 사용자가 음수를 입력하면 양수 입력하라는 메시지를 출력한 후 다시 입력을 받으세요.
출력 예:
숫자 : 10, 반복 횟수 : 0
숫자 : 9, 반복 횟수 : 1
숫자 : 8, 반복 횟수 : 2
숫자 : 7, 반복 횟수 : 3
숫자 : 6, 반복 횟수 : 4
숫자 : 5, 반복 횟수 : 5
숫자 : 4, 반복 횟수 : 6
숫자 : 3, 반복 횟수 : 7
숫자 : 2, 반복 횟수 : 8
숫자 : 1, 반복 횟수 : 9
숫자 : 0 완료. 최종 반복 횟수는 10회 입니다.
답:
repnum = 0
# 양수가 입력될 때까지 반복 입력
while True:
num = int(input("양수를 입력하시오 : "))
if num > 0:
break
print("양수를 입력하라구...")
# 숫자가 0이 될 때까지 반복
while num > 0:
print(f"숫자 : {num}, 반복 횟수 : {repnum}")
num -= 1
repnum += 1
print(f"숫자 : {num} 완료. 최종 반복 횟수는 {repnum}회 입니다.")
#34
사용자에게 아이디와 비번을 입력받고 입력한 아이디가 맞으면 비번을 입력받으세요. 입력 받은 아이디가 틀리면 "그런 아아디는 존재하지 않습니다."를 출력하세요. 아이디가 맞는 경우에만 비번을 입력 받고 로그인 성공 여부를 출력하세요. 패스워드 입력 시도 횟수는 5회입니다. 입력 가능 횟수를 초과하면 다시 아이디 입력을 받습니다.
사용자의 아이디와 비번:
login_id = "1234"
login_pw = "1234"
답:
login_id = "1234"
login_pw = "1234"
id = ""
pw = ""
count=0
while (login_id != id):
id = input("아이디를 입력하시오 : ")
if (login_id == id):
for i in range(1,6):
pw = input("비밀번호를 입력하시오 : ")
if (login_pw == pw):
print("로그인 성공")
break
else:
count = i
print(f"비밀번호가 옳지 않습니다. 실패 횟수 : {count} 회\n")
if (count == 5):
print("입력 가능 횟수를 초과하였습니다.")
else:
print("아이디가 옳지 않습니다. 다시 입력하세요.\n")
#35
2단부터 9단까지 구구단을 모두 출력하세요. 각 단 사이에는 --------와 같은 적당한 구분 문자를 출력하세요.
답:
for i in range(1,9):
i = i+1
for j in range(9):
j = j+1
print(f'{i} x {j} = {i*j}')
print("-------------------------------")
#36
별 모양을 출력하세요.
1.
*
**
***
****
*****
답:
for i in range(1, 6):
print("*" * i)
2.
*****
****
***
**
*
답:
for i in range(5, 0, -1):
print("*" * i)
3.
*
***
*****
*******
*********
*******
*****
***
*
답:
height = 5
width = 2 * height - 1
# 위쪽 피라미드
for i in range(height):
stars = 2 * i + 1
print(f"{'*' * stars:^{width}}")
# 아래쪽 역피라미드
for i in range(height - 1, 0, -1):
stars = 2 * i - 1
print(f"{'*' * stars:^{width}}")
4.
*****
****
***
**
*
답:
height = 5
for i in range(height, 0, -1):
print(f"{'*' * i:>{height}}")
#37
다음과 같이 저장된 EPL 상위 20개 팀 리스트가 있습니다.
teams = [
'아스널',
'맨체스터 시티',
'애스턴 빌라',
'맨체스터 유나이티드',
'첼시',
'리버풀',
'풀럼',
'브렌트포드',
'뉴캐슬 유나이티드',
'에버턴',
'선덜랜드',
'브라이턴 & 호브 알비언',
'본머스',
'토트넘 홋스퍼',
'크리스털 팰리스',
'리즈 유나이티드',
'노팅엄 포레스트',
'웨스트햄 유나이티드',
'울버햄프턴 원더러스',
'번리'
]
순위(1위부터)와 팀명을 출력하세요.
답:
teams = [
'아스널','맨체스터 시티','애스턴 빌라','맨체스터 유나이티드',
'첼시','리버풀','풀럼','브렌트포드','뉴캐슬 유나이티드',
'에버턴','선덜랜드','브라이턴 & 호브 알비언','본머스',
'토트넘 홋스퍼','크리스털 팰리스','리즈 유나이티드',
'노팅엄 포레스트','웨스트햄 유나이티드',
'울버햄튼 원더러스','번리'
]
#방법1
print("===== range(len()) 방식 =====")
for i in range(len(teams)):
print(f"순위 : {i+1}, 팀 : {teams[i]}")
print("==============================")
#방법2
print("===== append + index 방식 =====")
teams.append("END")
count = teams.index("END")
for j in range(count):
print(f"순위 : {j+1}, 팀 : {teams[j]}")
print("==============================")
#방법3
print("===== for in teams 방식 =====")
for team in teams:
if team == "END":
continue
print(f"순위 : {teams.index(team)+1}, 팀 : {team}")
#38
1에서 20까지 짝수만 포함하는 리스트를 comprehension으로 작성하시오.
답:
L = [n for n in range(1,21) if n%2==0]
print(L)
내포 문법 : [표현식 for 항목 in 순회가능객체 [if 조건] ]
#39
다음과 같은 함수가 정의되어 있다.
def game_result(home, away, home_score=0, away_score=0, league="KBO"):
print(f"[{league}] {home} {home_score} : {away_score} {away}")
다음 코드들의 출력 결과를 예상하시오.
1.
game_result("LG 트윈스", "두산 베어스")
답:
[KBO] LG 트윈스 0 : 0 두산 베어스
- home, away → 위치인자 (필수)
- home_score, away_score, league → 기본인자
위 함수 호출에서
- "LG 트윈스" → home
- "두산 베어스" → away
점수와 리그는 전달되지 않았으므로 기본값을 사용한다.
- home_score = 0
- away_score = 0
- league = "KBO"
2.
game_result("KIA 타이거즈", "삼성 라이온즈", 5, 3)
답:
[KBO] KIA 타이거즈 5 : 3 삼성 라이온즈
- 위치인자는 앞에서부터 순서대로 매칭
- "KIA 타이거즈" → home
- "삼성 라이온즈" → away
- 5 → home_score
- 3 → away_score
- league는 전달되지 않아 기본값 "KBO" 사용
위치인자가 기본인자를 덮어쓴 사례
3.
game_result("SSG 랜더스", "NC 다이노스", away_score=2)
답:
[KBO] SSG 랜더스 0 : 2 NC 다이노스
- "SSG 랜더스" → home (위치인자)
- "NC 다이노스" → away (위치인자)
- away_score=2 → 키워드 인자로 특정 값만 지정
- home_score는 전달되지 않아 기본값 0
- league도 기본값 "KBO"
위치인자 + 키워드 인자 + 기본인자 혼합 사용
4.
game_result(
away="한화 이글스",
home="롯데 자이언츠",
league="KBO 리그",
home_score=4
)
답:
[KBO 리그] 롯데 자이언츠 4 : 0 한화 이글스
- 전부 키워드 인자로 전달됨 → 순서 무관
- home="롯데 자이언츠"
- away="한화 이글스"
- home_score=4
- league="KBO 리그"
- away_score는 전달되지 않아 기본값 0
키워드 인자는 순서를 무시하고 이름으로만 매칭
#40
당신은 마트 계산대 프로그램을 만들고 있습니다. 손님이 구매한 상품은 개수와 가격이 정해져 있지 않고, 결제 정보 또한 상황에 따라 달라질 수 있습니다. 다음 조건을 만족하는 함수 checkout()을 작성하세요. 구매한 상품 가격들은 위치인자(*args) 로 받으세요. 결제 관련 정보는 키워드 인자(**kwargs) 로 받으세요. 전달된 모든 정보를 요약하여 출력하세요.
입력:
checkout(
1200, 3500, 800, 2400,
customer="김철수",
payment="카드",
discount="회원 할인"
)
출력:
구매 상품 가격: (1200, 3500, 800, 2400)
총 금액: 7900
결제 정보: {'customer': '김철수', 'payment': '카드', 'discount': '회원 할인'}
답:
def checkout(*args, **kwargs):
# 구매 상품 가격 목록
print("구매 상품 가격:", args)
# 총 구매 금액
total = sum(args)
print("총 금액:", total)
# 결제 정보
print("결제 정보:", kwargs)
# 테스트 코드
checkout(
1200, 3500, 800, 2400,
customer="김철수",
payment="카드",
discount="회원 할인"
)
*args : 위치 인자를 받음. 함수 내부에서 튜플로 자동으로 묶임
**kwargs : 키워드 인자를 받음. 함수 내부에서 딕셔너리로 자동 묶임
#41
Lambda 함수를 이용해 사칙연산 계산기 프로그램을 만드세요.
1. x,y를 입력 받는다.
2. 연산자를 입력 받는다.
3. 입력받은 연산자를 키값으로 해서 사전을 호출한 뒤 value 값을 반환
4. 계산 과정도 출력한다.
출력 예:

답:
operations = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y if y != 0 else "오류: 0으로 나눌 수 없음"
}
'''
1. x,y를 입력 받는다.
2. 연산자를 입력 받는다.
3. 입력받은 연산자를 키값으로 해서 사전을 호출한 뒤 value 값을 반환
4. 계산 과정도 출력한다.
'''
x = float(input("첫 번째 숫자를 입력하세요 : "))
y = float(input("두 번째 숫자를 입력하세요 : "))
op = input("연산자를 입력하세요 : ")
v = operations[op](x, y)
print(f"{x} {op} {y} = {v}\n")
Lambda function은 이름 없는 한 줄자리 함수이다.
#42
random 모듈을 이용해서 로또 번호 추출 프로그램을 만드세요.
- 1~45 사이의 숫자 중에서 랜덤 추출
- 로또 1개 당 6개의 숫자 뽑기
- 기본으로 1개는 돌아감. 사용자가 로또 3 장을 샀다고 가정.
- 함수의 반환값은 2차원 리스트여야 한다.
답:
import random
def lotto(n=1):
result = []
for _ in range(n):
game = random.choices(range(1, 46), k=6)
result.append(game)
return result
# 실행
print(lotto(3))
#43
datetime 모듈을 사용해서 현재 시간을 화면에 출력해보세요.
답:
import datetime
now = datetime.datetime.now()
print(now)
#44
datetime 모듈의 timedelta를 사용해서 오늘로부터 5일, 4일, 3일, 2일, 1일 전의 날짜를 화면에 출력해보세요.
답:
import datetime
now = datetime.datetime.now()
for day in range(5, 0, -1):
delta = datetime.timedelta(days=day)
date = now - delta
print(date)
#45
현재시간을 얻어온 후 다음과 같은 포맷으로 시간을 출력해보세요.
18:35:01
답:
import datetime
now = datetime.datetime.now()
print(now.strftime("%H:%M:%S"))
#46
"2020-05-04"의 문자열을 시간 타입으로 변환해보세요.
답:
import datetime
day = "2020-05-04"
ret = datetime.datetime.strptime(day, "%Y-%m-%d")
print(ret, type(ret))
#47
time 모듈, datetime 모듈을 사용해서 1초에 한 번 현재 시간을 출력하는 코드를 작성하세요.
답:
import time
import datetime
while True:
now = datetime.datetime.now()
print(now)
time.sleep(1)
#48
os 모듈의 함수를 호출하여 현재 디렉터리의 경로를 화면에 출력해보세요.
답:
import os
ret = os.getcwd()
print(ret, type(ret))
#49
바탕화면에 텍스트 파일을 하나 생성한 후 os 모듈의 함수를 호출하여 해당 파일의 이름을 변경해보세요.
답:
import os
os.rename("C:/Users/hyunh/Desktop/before.txt", "C:/Users/hyunh/Desktop/after.txt")
#50
예금 계좌 class를 만드세요.
- BankAccount 예금계좌 클래스를 생성
- 변수: 예금주 owner, 잔고 balance를 가짐
- 메서드
-- 입금 : deposit(amount)
-- 출금 : withdraw(amount)
-- 잔액 확인: get_balance()
출력 예시:
# 김철수로 10000원 입금하며 계좌 개설
5000원이 입금되었습니다.
3000원이 출금되었습니다.
현재 잔액: 12000
답:
class BankAccount:
def __init__(self, owner, balance=0):
# 예금주
self.owner = owner
# 잔고
self.balance = balance
# 입금
def deposit(self, amount):
if amount <= 0:
print("입금 금액은 0보다 커야 합니다.")
return
self.balance += amount
print(f"{amount}원이 입금되었습니다.")
# 출금
def withdraw(self, amount):
if amount <= 0:
print("출금 금액은 0보다 커야 합니다.")
return
if amount > self.balance:
print("잔액이 부족합니다.")
return
self.balance -= amount
print(f"{amount}원이 출금되었습니다.")
# 잔액 확인
def get_balance(self):
return self.balance
account = BankAccount("김철수", 10000)
account.deposit(5000)
account.withdraw(3000)
print("현재 잔액:", account.get_balance())
#51
사칙 연산 계산기.
숫자 a, 숫자 b, 연산자 op(+,-,*,/)를 입력 받아 계산 결과를 출력한다.
이때 잘못된 숫자값, 연산자 등이 입력될 수 있으므로 이에 적절히 예외처리를 한다.
- ZeroDivisionError, ValueError, KeyError
아래 코드에 이어서 작성.
operations = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y
}
답:
operations = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y
}
# 두 수와 연산자를 사용자로부터 입력받고
# 입력된 연산을 operations를 이용하여 수행하기
# print(operations['+'](10,2))
try:
x = float(input("x: "))
y = float(input("y: "))
op = input("연산자(+,-,*,/): ")
# if op in operations.keys(): # ['+', '-', '*', '/']:
result = operations[op](x, y)
print(result)
except ZeroDivisionError as e:
print("0으로 나눌 수 없습니다.")
print(e)
except ValueError as e:
print("숫자만 입력 가능합니다.")
print(e)
except KeyError as e:
print("잘못된 연산자입니다.")
print(e)
except Exception as e:
print("알 수 없는 오류가 발생했습니다.")
print(e)
finally:
print("프로그램 종료.")
#52
당신은 물류 센터에서 대량의 주문 번호를 처리하는 프로그램을 만들고 있습니다.
하루에 처리해야 할 주문 번호는 수만 개 이상이 될 수 있어,
모든 주문 번호를 리스트에 한 번에 저장하면 메모리 사용량이 커지는 문제가 있습니다.
따라서 주문 번호를 하나씩 순차적으로 생성해서 처리할 수 있는 방식이 필요합니다.
다음 조건을 만족하는 제너레이터 함수를 작성하세요.
- 함수 이름은 order_generator로 한다.
- 매개변수로 시작 주문 번호 start와 끝 주문 번호 end를 받는다.
- start부터 end까지의 주문 번호를 하나씩 순차적으로 반환해야 한다.
- 모든 주문 번호를 리스트로 만들어 반환하면 안 된다.
- 함수 내부에서 반드시 yield를 사용해야 한다.
출력:
처리 중인 주문 번호: 1001
처리 중인 주문 번호: 1002
처리 중인 주문 번호: 1003
처리 중인 주문 번호: 1004
처리 중인 주문 번호: 1005
답:
def order_generator(start, end):
current = start
while current <= end:
yield current
current += 1
orders = order_generator(1001, 1005)
for order in orders:
print("처리 중인 주문 번호:", order)
yield는 값을 하나 반환하고 함수 실행을 멈춤.
다음 반복에서 멈춘 지점부터 다시 실행.
#53
당신은 쇼핑몰 콘솔 프로그램을 개발하고 있습니다.
이 프로그램에는 여러 메뉴가 있으며, 일부 메뉴는 사용자 인증이 된 경우에만 접근 가능해야 합니다.
현재 시스템에는 전역 변수 AUTH가 있으며,
- AUTH = True → 인증된 사용자
- AUTH = False → 인증되지 않은 사용자
를 의미합니다.
- 인증된 경우에만 특정 함수가 실행되도록 제어
- 인증이 필요한 메뉴 : 1번, 2번
- 인증이 필요 없는 기능 : 3번
아래 코드에서 일부 코드를 추가해서 완성시키세요.
user_id = '1234'
user_pw = '1234'
AUTH = False
# 로그인 로직
def login(user_id, user_pw, max_try=3):
attempts = 0
while attempts < max_try:
input_id = input("아이디 입력 : ")
input_pw = input("비밀번호 입력 : ")
if input_id == user_id and input_pw == user_pw:
print("로그인 성공")
return True
else:
print("[!] 아이디 또는 비밀번호가 틀렸습니다.")
attempts += 1
print("[!] 로그인 시도 횟수를 초과했습니다.")
return False
# 사용 승인 체크
def auth_required(func):
def wrapper(*args, **kwargs):
global AUTH
if AUTH == True:
print("접근 승인")
result = func(*args, **kwargs)
else:
result = print("[!]접근 권한이 없습니다.")
return result
return wrapper
# 메뉴1
def order_list():
print("*********************")
print("구매 리스트 출력")
print("만두, 아이스크림, 콜라")
print("*********************")
#메뉴2
def return_list():
print("*********************")
print("반품 리스트 출력")
print("커피, 책")
print("*********************")
#메뉴3
def recommend_list():
print("*********************")
print("추천 목록 출력")
print("참치, 라면, 피자")
print("*********************")
while True:
print("============================")
print("[0] : 로그인")
print("[1] : 구매 리스트")
print("[2] : 교환 반품 리스트")
print("[3] : 오늘의 추천 상품")
c = input("메뉴 선택: ")
if c == "1":
order_list()
elif c == "2":
return_list()
elif c == "3":
recommend_list()
elif c == "0":
AUTH = login(user_id, user_pw)
else:
break
답:
user_id = '1234'
user_pw = '1234'
AUTH = False
# 로그인 로직
def login(user_id, user_pw, max_try=3):
attempts = 0
while attempts < max_try:
input_id = input("아이디 입력 : ")
input_pw = input("비밀번호 입력 : ")
if input_id == user_id and input_pw == user_pw:
print("로그인 성공")
return True
else:
print("[!] 아이디 또는 비밀번호가 틀렸습니다.")
attempts += 1
print("[!] 로그인 시도 횟수를 초과했습니다.")
return False
# 사용 승인 체크
def auth_required(func):
def wrapper(*args, **kwargs):
global AUTH
if AUTH == True:
print("접근 승인")
result = func(*args, **kwargs)
else:
result = print("[!]접근 권한이 없습니다.")
return result
return wrapper
@auth_required # 여기!!!!!!!
def order_list():
print("*********************")
print("구매 리스트 출력")
print("만두, 아이스크림, 콜라")
print("*********************")
@auth_required # 여기!!!!!!!!
def return_list():
print("*********************")
print("반품 리스트 출력")
print("커피, 책")
print("*********************")
def recommend_list():
print("*********************")
print("추천 목록 출력")
print("참치, 라면, 피자")
print("*********************")
while True:
print("============================")
print("[0] : 로그인")
print("[1] : 구매 리스트")
print("[2] : 교환 반품 리스트")
print("[3] : 오늘의 추천 상품")
c = input("메뉴 선택: ")
if c == "1":
order_list()
elif c == "2":
return_list()
elif c == "3":
recommend_list()
elif c == "0":
AUTH = login(user_id, user_pw)
else:
break
#54
바탕화면에 '매수종목1.txt' 파일을 생성한 후 다음과 같이 종목코드를 파일에 써보세요.
005930
005380
035420
답:
f = open("C:/Users/Desktop/매수종목1.txt", mode="wt", encoding="utf-8")
f.write("005930\n")
f.write("005380\n")
f.write("035420")
f.close()
#55
바탕화면에 '매수종목.csv' 파일을 생성한 후 다음과 같이 종목코드와 종목명을 파일에 써보세요. 인코딩은 'cp949'를 사용해야합니다.

답:
import csv
f = open("C:/Users/Desktop/매수종목.csv", mode="wt", encoding="cp949", newline='')
writer = csv.writer(f)
writer.writerow(["종목명", "종목코드", "PER"])
writer.writerow(["삼성전자", "005930", 15.59])
writer.writerow(["NAVER", "035420", 55.82])
f.close()
#56
바탕화면에 생성한 '매수종목1.txt' 파일을 읽은 후 종목코드를 리스트에 저장해보세요.
답:
f = open("C:/Users/Desktop/매수종목1.txt", encoding="utf-8")
lines = f.readlines() # python list
codes = []
for line in lines:
code = line.strip() #'\n'
codes.append(code)
print(codes)
f.close()
#57
1. "file_w.txt"라는 파일을 만들고 쓰기 모드로 열어서 "Hello Python","안녕 파이썬" 적어서 저장.
답:
with open("file_w.txt", "w", encoding='utf-8') as f:
f.write("Hello Python\n")
f.write("안녕 파이썬")
2. "file_w.txt"라는 파일을 열어서 "Hello Python","잘가 파이썬" 추가로 적어서 저장.
답:
with open("file_w.txt", "a", encoding='utf-8') as f:
f.write("Hello Python\n")
f.write("안녕 파이썬")
3. "file_w.txt"라는 파일을 읽기모드로 열어서 한 줄씩 읽기
답:
with open("file_w.txt", "r", encoding='utf-8') as f:
lines = f.readlines()
# print(lines, type(lines))
for line in lines:
print(line, end='')
# 직접 가서 개념 보기
- 클래스
05-1 클래스
초보 개발자에게 클래스(class)는 넘기 힘든 장벽과도 같은 존재이다. 독자 중에도 클래스라는 단어를 처음 접하는 이들이 있을 것이다. 그러면 도대체 클래스가 무엇인지, 클래스…
wikidocs.net
- 이터레이터
01) 이터레이터
[TOC] ## 이터러블 파이썬에서 리스트, 튜플, 딕셔너리와 같은 기본 자료구조는 for나 while문을 사용해서 반복할 수 있습니다. 자료구조에는 다수의 데이터가 저장되…
wikidocs.net
- 제너레이터
03) 제너레이터
[TOC] ## 잘못된 일처리 방식 어떤 빵가게에서 제빵사가 빵을 굽고 점원이 이를 포장하고 있습니다. 제빵사는 빵가게 문을 열기 전까지 빵 100개를 만들어야 하는데 빵이…
wikidocs.net
https://wikidocs.net/184211#_3
07-3 이터레이터와 제너레이터
[[TODO]] - [v] 잘못된 내용이 있는지 논리적 오류가 없는지 확인해 줘 - [v] 작성한 내용중 어렵게 작성된 부분 또는 설명이 부족한 부분이 있는지 확인해 줘 - [v…
wikidocs.net
- 데코레이터
01) 데코레이터
[TOC] ## 데코레이터 영어 사전에서 decorator를 찾아보면 '장식하는 사람'이라는 뜻을 갖고 있습니다. 파이썬의 데코레이터 역시 동일한 의미로 사용됩니다. 어떤 …
wikidocs.net
02) 클로저 복습
[TOC] ## 데코레이터 사용 예 데코레이터는 초보자를 위한 문법은 아닙니다. 데코레이터는 주로 모듈 개발자들에게 필요한 문법이라 할 수 있습니다. 데코레이터는 만드는 것은…
wikidocs.net
03) 그림으로 그려보는 데코레이터
[TOC] ## 함수 데코레이터 데코레이터(decorator)라는 영어는 '실내 장식자'라는 뜻을 갖고 있습니다. 즉, 함수 데코레이터는 어떤 함수를 장식해주는(꾸며주는) 역…
wikidocs.net
07-2 클로저와 데코레이터
데코레이터를 이해하려면 먼저 클로저를 알아야 한다. 클로저를 먼저 알아보고 나서 데코레이터를 살펴보자. [TOC] ## 클로저란? 클로저란 **외부 함수의 변수를 기억하는 …
wikidocs.net
- 정규 표현식
08장 정규표현식
정규 표현식은 꽤 오랜 기간 코드를 작성해 온 개발자도 잘 모를 수 있는 고급 주제다. 초보자를 대상으로 하는 이 책에 다뤄야 할지 오랫동안 고민했다. 하지만 정규 표현식을 익…
wikidocs.net
# 추가로 풀어볼 문제들
# 야구 게임
Digit3 클래스 제작
• 내부에 무작위 세 자리 숫자를 저장: 중복 없는 세 자리 수, 첫 자리 0 안됨
• 사용자에게 세 자리 숫자를 입력받음
– 숫자를 입력했는지 체크
• 입력 받은 숫자가 내부 무작위 세 자리 숫자와 일치하는지 힌트를 출력
- 판정 규칙: 스트라이크 / 볼 / 아웃
- 스트라이크(Strike)
- 숫자도 같고 위치도 같으면 스트라이크
- 볼(Ball)
- 숫자는 있는데 위치가 다르면 볼
- 아웃(Out)
- 입력한 숫자 중 정답에 포함된 숫자가 하나도 없으면 아웃
승리조건: 정답이 3자리라면 3 스트라이크(3S) 가 나오면 즉시 승리
답 예시:
import random
class Digit3:
def __init__(self):
self.player_list = {}
self.cur_player = None
def init_game(self):
############################################################
# 3자리 숫자 초기화
# 각자리가 중복되면 안되고
# 첫자리가 0이 되면 안되고
# hint: 문자로 한 자리씩 숫자를 생성해서 0인지 검사하고
# 앞 숫자와 겹치는지 검사
one = str( random.randrange(1, 10) )
while True:
two = str( random.randrange(0, 10) )
if one != two:
break
while True:
three = str( random.randrange(0, 10) )
if one != three and two != three:
break
############################################################
#
self.d = one+two+three
# 개발 과정에서 내부적으로 초기화한 숫자를 화면에 뿌림
print('init_game:', self.d)
def q(self, digit):
# digit: 사용자로부터 입력된 세자리수
# digit이 self.d와 일치하는지 검사해서
# 볼카운트를 다음과 같은 사전으로 만들어 반환
# {'ball': 2, 'strike': 1}
strike = 0
ball = 0
############################################################
# self.d와 digit을 비교하여 볼카운트를 생성
# hint: 숫자를 문자로 다루기..."123"
# str.count()함수 사용
digit_s = str(digit)
for i, c in enumerate(digit_s):
if self.d.count(c): # c가 self.d안에 있다.
if self.d[i] == c:
strike += 1
else:
ball += 1
############################################################
# 볼카운트가 저장된 변수를 리턴
return {'ball': ball, 'strike': strike}
def rank(self):
# 현재 self.player_list에 저장된 플레이어들의 성적을 출력
# 플레이어 "아이디 {점수}회 만에 성공" 형식으로 출력
# self.payer_list 형식
# {'플레이어1': 점수, '플레이어2': 점수}
# hint: sorted()함수 사용, 정렬 키는 lambda식 사용
for name, score in sorted(self.player_list.items(), key=lambda item: item[1]):
print(f"{name}, {score}회 만에 성공")
def set_player(self):
# 게임을 시작할 때 플레이어 아이디를 입력받는 함수
self.cur_player= input("플레이어 아이디를 입력하세요: " )
if not self.player_list.get(self.cur_player, None):
print('신규플레이어초기화')
self.player_list[self.cur_player] = 0
def start_game(self):
# 게임을 초기화
self.init_game()
# 플레이어 세팅
self.set_player()
count = 0
# 게임 루프
# 게임이 끝날 때 까지 무한 반복
# 루프 중 고려해야할 사항
# 1. 사용자 입력 유효성 검사, 3자리 숫자인지, 숫자인지
# 2. 플레이어가 정답을 맞히면 self.palyer_list에 점수를 저장하고 루프를 탈출
# 점수를 저장할 때 기존 점수보다 더 좋은 점수일 경우에만 저장
while True:
# 사용자에게 입력받기
user_input = input("세 자리 수를 입력: ")
# 사용자 입력 유효성 검사
if len(user_input) == 3 and user_input.isdigit():
count += 1
result = self.q(user_input)
# 정답이면
if result['strike'] == 3:
print('정답')
if (
# 현재 플레이어의 점수가 0점이거나(신규플레이어란 의미)
self.player_list[self.cur_player] == 0 or
# 현재 플레이어의 점수가 있는데 이번 판의 점수가 더 좋으면
(self.player_list[self.cur_player] > 0 and count < self.player_list[self.cur_player])
):
# 플레이어 리스트 점수에 새로운 점수를 삽입
self.player_list[self.cur_player] = count
break
else:
print(f"{result['ball']} 볼, {result['strike']} 스트라이크")
else:
print("잘못된 입력입니다. 다시 입력하세요.")
if __name__ == '__main__':
# 게임 객체를 생성
digit3 = Digit3()
# 게임을 하고 나서
digit3.start_game()
# 플레이어의 성적을 화면에 뿌림
digit3.rank()
'프로그래밍 언어 기초 > Python' 카테고리의 다른 글
| python map() 함수 (1) | 2025.07.11 |
|---|---|
| python 공백 제거 함수 : strip(), lstrip(), rstrip() (1) | 2025.07.07 |
| Python 입력: sys.stdin 완전 정리 (3) | 2025.07.07 |
