TOC
- 참고 강의
- 연습문제 #1
- 연습문제 #2
- 연습문제 #3
- 연습문제 #4
- 연습문제 #6
- 연습문제 #7
- 연습문제 #8
- 연습문제 #11
- 연습문제 #12
- 연습문제 #13
- 연습문제 #14
- 연습문제 #16
- 연습문제 #17
- 연습문제 #18
- 연습문제 #19
- 연습문제 #20
- 연습문제 #21
- 연습문제 #22
- 연습문제 #23
- 연습문제 #24
- 연습문제 #25
- 연습문제 #26
- 연습문제 #27
참고 강의
SWEA 파이썬 프로그래밍 기초(2) 파이썬의 기본 응용 #3 ~ #25
연습문제 #1
문제
한 학생의 국어, 수학 점수를 튜플로 저장하고 이 튜플을 항목으로 갖는 리스트 객체가 있습니다. 이 때 첫 번째 학생은 (90, 80), 두 번째 학생은 (85, 75), 세 번째 학생은 (90, 100)의 점수를 갖습니다. 다음과 같이 결과를 만들기 위한 프로그램을 작성하십시오.
출력
1번 학생의 총점은 170점이고, 평균은 85.0입니다.
2번 학생의 총점은 160점이고, 평균은 80.0입니다.
3번 학생의 총점은 190점이고, 평균은 95.0입니다.
Sol
lst = []
s1 = (90, 80)
lst.append(s1)
s2 = (85, 75)
lst.append(s2)
s3 = (90, 100)
lst.append(s3)
for i, val in enumerate(lst):
total = 0
avg = 0
for j in val:
total += j
avg = total / len(val)
print("{0}번 학생의 총점은 {1}점이고, 평균은 {2:.1f}입니다.".format(i + 1, total, avg))
제출결과

연습문제 #2
문제
리스트 내포 기능을 이용해 다음 문장으로부터 모음('aeiou')을 제거하십시오.
'Python is powerful... and fast; plays well with others; runs everywhere; is friendly & easy to learn; is Open.'
출력
Pythn s pwrfl... nd fst; plys wll wth thrs; rns vrywhr; s frndly & sy t lrn; s Opn.
Sol
target_text = 'Python is powerful... and fast; plays well with others; runs everywhere; is friendly & easy to learn; is Open.'
target_list = list(target_text)
aeiou_text = 'aeiou'
aeiou_list = list(aeiou_text)
result_list = [item for item in target_list if not item in aeiou_list]
result_text = ""
for item in result_list:
result_text += item
print(result_text)
aeiou를 리스트화하여 input해주는 문자열의 각각의 문자가 이 aeiou 리스트 안에 있지 않은 것들만 result_list에 모았다. 그 후 이를 모두 이어붙이는 for문을 실행했다.
제출결과

연습문제 #3
문제
다음의 결과와 같이 구구단 2단부터 9단의 결과값 중에 3의 배수거나 7의 배수인 수를 제외한 값을 리스트 객체 result 안에 각 단마다 리스트를 만들어 삽입하고 이를 출력하십시오.
출력
[[2, 4, 8, 10, 16], [], [4, 8, 16, 20, 32], [5, 10, 20, 25, 40], [], [], [8, 16, 32, 40, 64], []]
Sol
다음의 단계를 거쳐야 할 것 같다.
- 각 변수들을 초기화한다.
- 2부터 9까지 돌리는 외부 루프
- 1부터 9까지 돌리는 내부 루프
- 내부 루프를 통해 나온 수를 리스트에 담는다.
- 이를 리스트 내포를 통해 3의 배수나 7의 배수를 필터링한다.
- 이를 append() 함수를 통해 result_list에 넣는다.
- result_list를 출력한다.
result_list = []
for a1 in range(2, 10):
# 각 단에 필요한 내부 리스트를 초기화
list_inner = []
list_inner_f = []
for a2 in range(1, 10):
ggd_result = a1 * a2
list_inner.append(ggd_result)
# 필터링 전의 각 단의 결과들 리스트를 리스트 내포로 필터링
list_inner_f = [item for item in list_inner if not (
(item % 3 == 0) or (item % 7 == 0))]
result_list.append(list_inner_f)
print(result_list)
제출결과

연습문제 #4
문제
리스트 내포 기능을 활용해 입력된 정수 값 5개의 평균을 출력하는 프로그램을 작성하십시오.
입력
10
10
20
30
40
출력
입력된 값 [10, 10, 20, 30, 40]의 평균은 22.0입니다.
Sol
리스트 내포를 이용하는 것보다 그냥 푸는 게 더 효율적일 것 같다고 생각이 들었다. 하지만 내포를 활용하라고 했으니 이용해보자.
- 입력된 값을 리스트에 모은다.
- 리스트 내포를 이용해 각 원소들을 원소들의 개수로 나눈 값을 result_list에 담는다.
- 이 각각을 sum(list)를 이용해 더한다. 이것이 평균이 된다.
- print문으로 출력해준다.
data_list = []
result = 0
for i in range(0, 5):
a = int(input())
data_list.append(a)
result_list = [item / len(data_list) for item in data_list]
result = sum(result_list)
print("입력된 값 {0}의 평균은 {1:.1f}입니다.".format(data_list, result))
제출결과

sum(list) 함수가 아니라 for문으로 각각의 원소를 최초 0으로 초기화한 result에 넣어 출력한 코드이다. 이 역시 Pass이다.
내포를 억지로 사용한 느낌이다. 어떻게 해야 더 효율적으로 내포를 활용할지 모르겠다.
연습문제 #6
문제
다음의 결과와 같이 정수를 입력하면 약수를 리스트에 추가해 출력하는 코드를 작성하십시오.
입력
12
출력
[1, 2, 3, 4, 6, 12]
Sol
이 문제야 말로 리스트 내포를 활용해보자.
num = int(input())
result_list = [item for item in range(1, num + 1) if (num % item == 0)]
print(result_list)
range(1, num + 1)을 원소로 하는 리스트의 각각의 원소들에 대해 num을 나누었을 때 0인, 즉 num의 정수인 원소들만 result_list에 따로 모은 것이다. 이를 print문으로 출력한다.
제출결과

연습문제 #7
문제
다음의 결과와 같이 정수를 입력하면 리스트 내포를 이용해 약수 리스트를 출력하는 코드를 작성하십시오.
입력
32
출력
[1, 2, 4, 8, 16, 32]
Sol
num = int(input())
result_list = [item for item in range(1, num + 1) if (num % item == 0)]
print(result_list)
연습문제 # 6과 같다. 이제보니 6번은 마음대로 풀으라는 것이고, 7번은 리스트 내포를 활용하라고 했는데, 나는 어차피 6번도 리스트 내포로 풀었으니 같은 답을 낸다.
제출결과

연습문제 #8
문제
[1, 3, 11, 15, 23, 28, 37, 52, 85, 100] 와 같은 리스트 객체가 주어졌을 때 다음의 결과를 출력하는 짝수만 항목으로 가지는 리스트 객체를 생성하는 코드를 작성하십시오.
출력
[28, 52, 100]
Sol
역시 리스트 내포를 활용해보자.
data_list = [1, 3, 11, 15, 23, 28, 37, 52, 85, 100]
result_list = [item for item in data_list if (item % 2 == 0)]
print(result_list)
제출결과

연습문제 #11
문제
리스트 내포 기능을 이용해 피보나치 수열 10번째까지 출력하는 프로그램을 작성하십시오.
출력
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Sol (내 답이 아님. 더 고민!)
정말 많이 고민해봤는데 도저히 감을 잡을 수 없어서 인터넷 조사를 통해 해결했다.
재도전💪다시 고민해볼 것!
def fibon(x):
if x == 0 or x == 1:
return 1
else:
return fibon(x-2) + fibon(x-1)
a = 10
answer_list = [fibon(x) for x in range(a)]
print(answer_list)
이제 보니까 언뜻 봤던 재귀함수인 것 같다. 스스로의 원소를 어떻게 불러올까 고민을 많이 했는데, 이렇게 함수 안에 스스로를 불러들이는 재귀함수를 사용하면 쉽게 해결할 수 있음에 놀랐다. 동시에 리스트 내포에 원소에 대한 재귀함수를 사용하면 정말 편하게 사용할 수 있다.
제출결과

연습문제 #12
문제
리스트 내포 기능을 이용하여 1부터 20사이의 숫자 중 3의 배수가 아니거나 5의 배수가 아닌 숫자들의 제곱 값으로 구성된 리스트 객체를 출력하는 프로그램을 작성하십시오.
출력
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 256, 289, 324, 361, 400]
Sol
list_origin = list(range(1, 21))
result_list = [
item ** 2 for item in list_origin if not ((item % 3 == 0) and (item % 5 == 0))]
print(result_list)
제출결과

연습문제 #13
문제
사용자가 숫자를 입력하면 숫자의 각 자릿수의 합을 구해서 반환하는 프로그램을 작성하십시오. 예를 들어 123을 입력하면 1 + 2 + 3 = 6의 결과를 반환합니다.
입력
12345
출력
15
Sol
data_list_str = list(input())
data_list_int = [int(item) for item in data_list_str]
print("{0}".format(sum(data_list_int)))
제출결과

연습문제 #14
문제
입력 받은 문자열 리스트를 가나다 순으로 따로 묶으려고 합니다. 다음과 같은 리스트가 주어졌을 때 결과처럼 가나다순(사전순)으로 따로 묶은 리스트가 출력되도록 리스트 내포를 이용한 프로그램을 작성하십시오.
dicBase = (('가','깋'), ('나','닣'), ('다','딯'), ('라','맇'), ('마','밓'), ('바','빟'), ('사','싷'), ('아','잏'), ('자','짛'), ('차','칳'), ('카','킿'), ('타','팋'), ('파','핗'), ('하','힣'))
inputWord = ['막', '부모님', '비용', '비행기', '원래', '처리', '최초', '꼴', '좀', '들다', '싶다', '수출', '계시다', '다', '뒤', '듣다', '함께', '아이', '무척', '보이다', '가지다', '그', '자르다', '데리다', '마리', '개', '정도', '옳다', '놀이','뜨겁다']
출력
[['계시다', '가지다', '그', '개'], ['놀이'], ['들다', '다', '뒤', '듣다', '데리다'], [],
['막', '무척', '마리'], ['부모님', '비용', '비행기', '보이다'], ['싶다', '수출'],
['원래', '아이', '옳다'], ['좀', '자르다', '정도'], ['처리', '최초'], [], [], [], ['함께']]
Sol A : 2중 for문
dicBase = (('가', '깋'), ('나', '닣'), ('다', '딯'), ('라', '맇'), ('마', '밓'), ('바', '빟'), ('사', '싷'),
('아', '잏'), ('자', '짛'), ('차', '칳'), ('카', '킿'), ('타', '팋'), ('파', '핗'), ('하', '힣'))
inputWord = ['막', '부모님', '비용', '비행기', '원래', '처리', '최초', '꼴', '좀', '들다', '싶다', '수출', '계시다', '다',
'뒤', '듣다', '함께', '아이', '무척', '보이다', '가지다', '그', '자르다', '데리다', '마리', '개', '정도', '옳다', '놀이', '뜨겁다']
outer_list = []
for dic in dicBase: # 외부 for문
inner_list = []
for target in inputWord: # 내부 for문
if dic[0] <= target <= dic[1]:
inner_list.append(target)
outer_list.append(inner_list)
print(outer_list)
각 자음들의 튜플 사이에 해당 자음으로 시작하는 문자가 들어가면 inner_list에 해당 input 원소를 채우고, 그 내부 루프가 모두 돌면 outer_list에 inner_list를 append하는 방식으로 진행한다.
제출결과

Sol B : 리스트 내포 이용
그렇다면 위의 2중 for문을 리스트 내포로 어떻게 나타낼까.
dicBase = (('가', '깋'), ('나', '닣'), ('다', '딯'), ('라', '맇'), ('마', '밓'), ('바', '빟'), ('사', '싷'),
('아', '잏'), ('자', '짛'), ('차', '칳'), ('카', '킿'), ('타', '팋'), ('파', '핗'), ('하', '힣'))
inputWord = ['막', '부모님', '비용', '비행기', '원래', '처리', '최초', '꼴', '좀', '들다', '싶다', '수출', '계시다', '다',
'뒤', '듣다', '함께', '아이', '무척', '보이다', '가지다', '그', '자르다', '데리다', '마리', '개', '정도', '옳다', '놀이', '뜨겁다']
outer_list = []
for dic in dicBase:
inner_list = []
inner_list = [target for target in inputWord if(
dic[0] <= target <= dic[1])]
outer_list.append(inner_list)
print(outer_list)
2중 내포를 구현하려 하였으나, list 안에 list가 있는 구조였기 때문에 그 각각의 원소들을 루프당 리스트를 어떻게 씌우는지 알 수 없어 for문 내에 list 내포를 사용하는 방식으로 하였다.
제출결과

연습문제 #16
문제
콤마(,)로 구분된 정수 값을 입력받아 리스트와 튜플 객체를 생성하는 코드를 작성하십시오.
입력
12, 34, 56, 78
출력
[12, 34, 56, 78]
(12, 34, 56, 78)
Sol A
txt = input()
list = []
element = ""
for i in txt:
try:
int(i)
except:
if i == ",":
list.append(int(element))
element = ""
else:
element += i
list.append(int(element))
tuple = tuple(list)
print(list)
print(tuple)
비효율적이지만 input() 그 텍스트를 어떻게 리스트나 튜플로 변환하는지 알 수 없어 try ~ except ~ else 문으로 하나하나 쪼개서 시퀀스 객체를 만들었다.
제출결과

Sol B
아무래도 너무 비효율적인 것 같고, 더 편하고 좋은 방법이 분명히 있을 것 같아 인터넷 조사를 통해 효율적인 코드를 찾았다. 출처
a = input()
t_list = list(map(int, a.split(', ')))
t_tuple = tuple(map(int, a.split(', ')))
print(t_list)
print(t_tuple)
map(func, sequence) 함수를 통해 sequence 객체의 원소 각각의 처리할 수 있다. 무엇보다, 내가 여러 줄의 코드를 통해 만든 리스트 객체를 split('sep') 함수를 통해 단숨에 해결할 수 있었다.... 역시 무식하면 고생한다. 허무하다.
연습문제 #17
문제
다음의 결과와 같이 사용자로부터 콤마(,)로 구분해 여러 원의 반지름을 입력 받아 이들에 대한 원의 둘레를 계산해 출력하는 프로그램을 작성하십시오.
입력
2, 3, 4, 5
출력
12.57, 18.85, 25.13, 31.42
Sol
import math
input_txt = '2, 3, 4, 5'
result = ""
r_list = list(map(int, input_txt.split(', ')))
l_list = [2 * math.pi * r for r in r_list]
for l in l_list:
result += "{0:.2f}, ".format(l)
print(result[:-2])
제출결과

연습문제 #18
문제
다음과 같이 2차원 배열 구조를 만들기 위한 행, 열 정보를 콤마(,)로 구분해 입력하고, 이 리스트 객체의 항목의 값은 행과 열의 인덱스 곱으로 초기화해 출력하는 프로그램을 작성하십시오.
입력
3, 5
출력
[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]
Sol
2중 for문을 이용하면 될 것 같다.
input = list(map(int, input().split(', ')))
r = input[0]
c = input[1]
list_o = []
list_i = []
for i in range(0, r):
list_i = []
for j in range(0, c):
list_i.append(j * i)
list_o.append(list_i)
print(list_o)
제출결과

연습문제 #19
문제
단어를 콤마(,)로 구분해 입력하면 그 단어들을 사전순으로 정렬해 출력하는 프로그램을 작성하시시오.
입력
python, hello, world, hi
출력
hello, hi, python, world
Sol
map(), split(), sorted() 함수를 사용하면 될 것 같다.
input = list(input().split(', '))
input_s = sorted(input)
result = ""
for i in input_s:
result += i
result += ", "
print(result[:-2])
제출결과

연습문제 #20
문제
콤마(,)로 구분해 숫자를 입력하고, 입력된 숫자 중 홀수를 콤마(,)로 구분해 출력하는 리스트 내포 기능을 이용한 프로그램을 작성하십시오.
입력
1, 2, 3, 4, 5
출력
1, 3, 5
Sol
odd_list = []
result = ""
input_list = list(map(int, input().split(', ')))
odd_list = [item for item in input_list if (item % 2 == 1)]
for i in odd_list:
result += str(i)
result += ", "
print(result[:-2])
제출결과

연습문제 #21
문제
주어진 튜플 (1,2,3,4,5,6,7,8,9,10)의 앞 항목 절반과 뒤 항목 절반을 출력하는 프로그램을 작성하십시오.
출력
(1, 2, 3, 4, 5)
(6, 7, 8, 9, 10)
Sol
tuple_input = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
idx_f = len(tuple_input)
idx_h = int(idx_f / 2)
print(tuple_input[:idx_h])
print(tuple_input[idx_h:])
제출결과

연습문제 #22
문제
리스트 내포 기능을 이용해 [5, 6, 77, 45, 22, 12, 24]에서 짝수를 제거한 후 리스트를 출력하는 프로그램을 작성하십시오.
출력
[5, 77, 45]
Sol
list_i = [5, 6, 77, 45, 22, 12, 24]
list_r = [item for item in list_i if (item % 2 == 1)]
print(list_r)
제출결과

연습문제 #23
문제
리스트 내포 기능을 이용해 [12, 24, 35, 70, 88, 120, 155]에서 홀수번째 항목을 제거한 후 리스트를 출력하는 프로그램을 작성하십시오.
출력
[24, 70, 120]
Sol
list_i = [12, 24, 35, 70, 88, 120, 155]
list_r = [item for item in list_i if (list_i.index(item) % 2 == 1)]
print(list_r)
list.index(element) 함수를 이용해야 한다. list 내의 해당 element의 index 값을 도출하므로, 이 값을 2로 나눈 나머지가 1인 홀수 인덱스 원소들만 추출하여 출력한다.
제출결과

연습문제 #24
문제
항목 값으로는 0을 갖는 234 형태의 3차원 배열을 생성하는 리스트 내포 기능을 이용한 프로그램을 작성하십시오.
입력
[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
출력
Sol (내 답이 아님. 더 고민!)
다중 리스트 내포에서 리스트 기호를 어떻게 넣어야 하나 고민하다가, 답을 찾아보게 되었다.
a = [0 for i in range(4)]
b = [a for i in range(3)]
c = [b for i in range(2)]
print(c)
한 번의 리스트 내포에서는 안 되고 내포한 리스트를 또 다른 리스트 내포의 원소로 쓰고, 또 원소로 쓰면서 다중 리스트를 만들어낸다.
제출결과

연습문제 #25
문제
리스트 내포 기능을 이용해 [12, 24, 35, 70, 88, 120, 155]에서 첫번째, 다섯번째, 여섯번째 항목을 제거한 후 리스트를 출력하는 프로그램을 작성하십시오.
출력
[24, 35, 70, 155]
Sol
list_i = [12, 24, 35, 70, 88, 120, 155]
no_k = [1, 5, 6]
no_i = list(map(lambda x: x - 1, no_k))
list_r = [item for item in list_i if not (list_i.index(item) in no_i)]
print(list_r)
제거해야 하는 번째를 숫자 리스트(no_k)로 만들었고, 이를 정확한 index로 세기 위해 1씩 빼는 lambda, map, list 함수를 사용했다. 리스트 내포에서는 이 제거하는 인덱스에 해당하는 인덱스를 제외한 나머지 원소들을 list_r 에 모아 출력하였다.
제출결과

연습문제 #26
문제
두 개의 리스트 [1,3,6,78,35,55]와 [12,24,35,24,88,120,155]를 이용해 양쪽 리스트에 모두 있는 항목을 리스트로 반환하는 프로그램을 작성하십시오.
출력
[35]
Sol
list1 = [1, 3, 6, 78, 35, 55]
list2 = [12, 24, 35, 24, 88, 120, 155]
list_r = [item for item in list1 if (item in list2)]
print(list_r)
list1의 각 원소들을 list2에 있는지 in list
방식으로 찾으면 되는 것.
제출결과

연습문제 #27
문제
리스트의 항목 중 중복이 되는 항목을 제거하는 함수를 정의하고 이 함수를 이용해 [12,24,35,24,88,120,155,88,120,155]에서 중복이 제거된 리스트를 출력하십시오.
출력
[12, 24, 35, 88, 120, 155]
Sol
def KillTwin(lst):
print(sorted(list(set(lst))))
list_i = [12, 24, 35, 24, 88, 120, 155, 88, 120, 155]
KillTwin(list_i)
제출결과
