7.1 다음과 같이 파이썬 프로그램을 실행할 때, 각 결과를 예측한 후 실행하여 예측한 답이 맞는지 확인하시오.
num_list = [100, 200, 300, 400, 500, 600, 700, 800]
high = 3
low = 3
# 7.1.1
num_list[high]
400
# 7.1.2
num_list[high - 2]
200
# 7.1.3
num_list[high - low]
100
# 7.1.4
num_list[low - high]
100
# 7.1.5
num_list[-1]
800
# 7.1.6
num_list[-low]
600
# 7.1.7
num_list[2 * 3]
700
# 7.1.8
num_list[2] * 3
900
# 7.1.9
num_list[5 % 4]
200
# 7.1.10
len(num_list)
8
# 7.1.11
min(num_list)
100
# 7.1.12
max(num_list)
800
# 7.1.13
num_list[:3]
[100, 200, 300]
# 7.1.14
num_list[1:5]
[200, 300, 400, 500]
# 7.1.15
num_list[-1:-5:-1]
[800, 700, 600, 500]
# 7.1.16
num_list[-5:-1:1]
[400, 500, 600, 700]
7.2 다음과 같은 list1, list2가 있을 경우 이중 for 루프를 사용하여 list1과 list2의 각 원소를 곱한 후 원소의 곱셈을 아래와 같이 출력하시오.
##### Don't modify this cell #####
list1 = [3, 5, 7]
list2 = [2, 3, 4, 5, 6]
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
...
# your code here
len1 = len(list1)
len2 = len(list2)
for i in range(0, len1, 1):
for j in range(0, len2, 1):
print(list1[i], '*', list2[j], '=', list1[i]*list2[j])
3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42
7.3 다음과 같은 문자열을 가진 두 개의 리스트 list1, list2가 있을 경우 list1과 list2의 모든 조합을 생성하여 다음과 같이 출력하시오.
list1 = ['I like', 'I love']
list2 = ['pancakes.', 'kiwi juice.', 'espresso.']
I like pancakes.
I like kiwi juice.
I like espresso.
I love pancakes.
I love kiwi juice.
I love espresso.
# your code here
len1 = len(list1)
len2 = len(list2)
for i in range(0, len1, 1):
for j in range(0, len2, 1):
print(list1[i], list2[j])
I like pancakes. I like kiwi juice. I like espresso. I love pancakes. I love kiwi juice. I love espresso.
7.4 다음 코드에서 잘못된 부분을 찾아 설명하시오.
# 7.4.1
t = (10, 20, 30, 40)
t.append(50)
# 7.4.2
t = (10, 20, 30, 40)
t.remove(50)
# 7.4.3
t = (10, 20, 30, 40)
t[0] = 0
7.5 ('A', 'B', 'C') 튜플과 ('1', '2')을 조합하여 다음과 같은 공연장의 좌석번호를 생성하는 프로그램을 작성하여라.
['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
# your code here
t1 = ('A', 'B', 'C')
t2 = ('1', '2')
seat = []
len1 = len(t1)
len2 = len(t2)
for i in range(0, len1, 1):
for j in range(0, len2, 1):
seat.append(t1[i] + t2[j])
print(seat)
['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
7.6 사용자로부터 임의의 문자열을 입력으로 받은 후 이 문자열에 대하여 다음과 같은 피라미드 패턴을 만들어 출력하는 프로그램을 작성하여라. 이때 파이썬의 문자열 슬라이싱 기능을 사용하도록 하여라.
문자열을 입력하세요 : python
p
py
pyt
pyth
pytho
python
pytho
pyth
pyt
py
p
# your code here
mystr = input('문자열을 입력하세요 : ')
L = len(mystr)
for i in range(1, L + 1):
print(mystr[0 : i])
for i in range(L - 1, 0, -1):
print(mystr[0 : i])
문자열을 입력하세요 : python p py pyt pyth pytho python pytho pyth pyt py p
7.7 fruit_list = ['banana', 'orange', 'kiwi', 'aapple', 'melon'] 의 리스트가 존재한다.
1) 이 fruit_list에서 가장 길이가 긴 문자열을 찾아서 출력하고 이 리스트에서 삭제하라. 이때 동일한 길이의 문자열이 있을 경우 이들을 모두 삭제하라.
가장 길이가 긴 문자열 : ['banana', 'orange']
fruit_list = ['kiwi', 'apple', 'melon']
# your code here
fruit_list = ['banana', 'orange', 'kiwi', 'apple', 'melon']
length = len(fruit_list)
length_list = []
for i in range(0, length):
length_list.append(len(fruit_list[i]))
max_length = max(length_list)
idx = []
for i in range(0, length):
if max_length == len(fruit_list[i]):
idx.append(i)
delete_list = []
for i in range(0, len(idx)):
delete_list.append(fruit_list[idx[i]])
for i in range(0, len(delete_list)):
fruit_list.remove(delete_list[i])
print('가장 길이가 긴 문자열 : ', delete_list)
print('fruit_list = ', fruit_list)
가장 길이가 긴 문자열 : ['banana', 'orange'] fruit_list = ['kiwi', 'apple', 'melon']
2) 이 fruit_list와 for 반복문을 이용하여 다음과 같은 문장을 출력하여라.
banana : 문자열의 길이 6
orange : 문자열의 길이 6
kiwi : 문자열의 길이 4
apple : 문자열의 길이 5
melon : 문자열의 길이 5
# your code here
fruit_list = ['banana', 'orange', 'kiwi', 'apple', 'melon']
for i in range(0, length):
print(fruit_list[i], ': 문자열의 길이', len(fruit_list[i]))
banana : 문자열의 길이 6 orange : 문자열의 길이 6 kiwi : 문자열의 길이 4 apple : 문자열의 길이 5 melon : 문자열의 길이 5
7.8 사용자로부터 숫자 1보다 크고 10보다 작은 값 n을 입력으로 받아서 다음과 같이 뱀의 몸통처럼 증가하는 이차원 배열을 출력하는 뱀행렬을 생성하여라. 이 행렬의 특징은 n이 5일 때 5x5 크기의 2차원 배열을 생성하는데, 이때 홀수 번째 행이 숫자가 증가하는 방향이 될 경우 짝수 번째 행은 숫자가 감소하는 형태를 가지는 특정이 있다.
n을 입력하시오 : 5
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
# your code here
result = []
n = int(input('n을 입력하시오 : '))
for i in range(0, n):
col = []
if i%2 == 0:
for j in range(0, n):
col.append(i*n + j + 1)
else:
for j in range(n - 1, -1, -1):
col.append(i*n + j + 1)
result.append(col)
for i in range(0, n):
for j in range(0, n):
if j == n - 1:
print(result[i][j])
else:
print(result[i][j], end = ' ')
n을 입력하시오 : 5 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 21 22 23 24 25
7.9 사용자로부터 두 문자열 A, B를 입력으로 받도록 하자. 그리고 A의 뒷부분과 B의 앞부분을 가장 길게 일치시켜 둘을 겹치게 만든 새로운 문자열 C를 만드는 프로그램을 작성하시오. 만약 A의 뒷부분과 B의 앞부분이 다르면 B를 A 뒤에 바로 붙여야 한다. 다음 예시를 참고하여라. 이를 위하여 C = overlap(A, B)와 같이 A, B를 인자로 받아 C를 반환하는 함수 overlap()을 구현하여라.
문자열 A | 문자열 B | 출력된 문자열 C |
---|---|---|
commu | mummy | commummy |
boxok | xbox | boxokxbox |
deter | detery | detery |
waycom | ycomget | waycomget |
tttttt | tttttt | tttttt |
# your code here
def overlap(A, B):
length = min(len(A), len(B))
for i in range(length, 0, -1):
if A[-i:] == B[:i]:
return A + B[i:]
return A + B
A = ['commu', 'boxok', 'deter', 'waycom', 'tttttt']
B = ['mummy', 'xbox', 'detery', 'ycomget', 'tttttt']
for i in range(0, 5):
print('A :', A[i], ', B :', B[i], ', C :', overlap(A[i], B[i]))
A : commu , B : mummy , C : commummy A : boxok , B : xbox , C : boxokxbox A : deter , B : detery , C : detery A : waycom , B : ycomget , C : waycomget A : tttttt , B : tttttt , C : tttttt
7.10 $Matrix~Multiplication$
$3\text{x}3$ 행렬 $A$, $B$을 입력받아 $A$와 $B$의 행렬곱을 출력하는 함수 mtx_mult(A, B)을 구현하시오(matmul 등의 함수 사용 금지).
$$ A = \begin{bmatrix}A_{11} & A_{12} & A_{13} \\ \hline A_{21} & A_{22} & A_{23} \\ \hline A_{31} & A_{32} & A_{33}\end{bmatrix}, ~B=\begin{bmatrix}\begin{array}{c|c} \begin{matrix}B_{11}\\B_{21}\\B_{31}\end{matrix} & \begin{matrix}B_{12}\\B_{22}\\B_{32}\end{matrix} & \begin{matrix}B_{13}\\B_{23}\\B_{33}\end{matrix} \end{array}\end{bmatrix}, $$$$ AB = \begin{bmatrix}A_{11}B_{11}+A_{12}B_{21}+A_{13}B_{31} & A_{11}B_{12}+A_{12}B_{22}+A_{13}B_{32} & A_{11}B_{13}+A_{12}B_{23}+A_{13}B_{33} \\ A_{21}B_{11}+A_{22}B_{21}+A_{23}B_{31} & A_{21}B_{12}+A_{22}B_{22}+A_{23}B_{32} & A_{11}B_{13}+A_{12}B_{23}+A_{13}B_{33}\\ A_{31}B_{11}+A_{32}B_{21}+A_{33}B_{31} & A_{31}B_{12}+A_{32}B_{22}+A_{33}B_{32} & A_{31}B_{13}+A_{32}B_{23}+A_{33}B_{33}\end{bmatrix} $$# your code here
def mtx_mult(A, B):
C = []
for i in range(0, 3):
row_temp = []
for j in range(0, 3):
temp = 0
for k in range(0, 3):
temp += A[i][k] * B[k][j]
row_temp.append(temp)
C.append(row_temp)
#C = np.matmul(A, B)
return C
아래 코드는 Euler Angle, 즉 Roll($\phi$), Pitch($\theta$), Yaw($\psi$)을 입력받아 항공기의 자세를 시각화하는 코드이다. 임의의 Euler Angle을 입력한 뒤 두 셀을 차례로 실행해 함수 mtx_mult가 정상적으로 작동하는지 검증하시오.
# your Euler angle(in degree)
phi = 10
theta = 20
psi = -60
##### Don't modify this cell #####
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Creating DCM
D2R = np.pi/180
R_phi = [[1, 0, 0], [0, np.cos(phi*D2R), np.sin(phi*D2R)], [0, -np.sin(phi*D2R), np.cos(phi*D2R)]]
R_theta = [[np.cos(theta*D2R), 0, -np.sin(theta*D2R)], [0, 1, 0], [np.sin(theta*D2R), 0, np.cos(theta*D2R)]]
R_psi = [[np.cos(psi*D2R), np.sin(psi*D2R), 0], [-np.sin(psi*D2R), np.cos(psi*D2R), 0], [0, 0, 1]]
NED2Euler = np.array(mtx_mult(mtx_mult(R_phi, R_theta), R_psi))
Euler2NED = NED2Euler.T
# Visualization
a = 1.5
b = 1
c = 0.3
d = 2
Euler_1 = [a*2/3, 0, 0]
Euler_2 = [-a/3, b/2, 0]
Euler_3 = [-a/3, -b/2, 0]
Euler_4 = [-a/3, 0, 0]
Euler_5 = [-a/3, 0, -c]
ax_Euler_1 = [d, 0, 0]
ax_Euler_2 = [0, d, 0]
ax_Euler_3 = [0, 0, d]
NED_1 = Euler2NED@Euler_1
NED_2 = Euler2NED@Euler_2
NED_3 = Euler2NED@Euler_3
NED_4 = Euler2NED@Euler_4
NED_5 = Euler2NED@Euler_5
ax_NED_1 = Euler2NED@ax_Euler_1
ax_NED_2 = Euler2NED@ax_Euler_2
ax_NED_3 = Euler2NED@ax_Euler_3
fig = plt.figure(figsize=(10, 10))
plot_plane = fig.add_subplot(111,projection='3d')
plot_plane.plot([0, 0], [0, d], [0, 0], 'r:', label = 'N')
plot_plane.plot([0, d], [0, 0], [0, 0], 'g:', label = 'E')
plot_plane.plot([0, 0], [0, 0], [0, -d], 'b:', label = 'D')
plot_plane.scatter(0, -d, 0, alpha = 0)
plot_plane.scatter(-d, 0, 0, alpha = 0)
plot_plane.scatter(0, 0, d, alpha = 0)
plot_plane.plot([NED_1[1], NED_2[1]], [NED_1[0], NED_2[0]], [-NED_1[2], -NED_2[2]], 'k')
plot_plane.plot([NED_1[1], NED_3[1]], [NED_1[0], NED_3[0]], [-NED_1[2], -NED_3[2]], 'k')
plot_plane.plot([NED_1[1], NED_4[1]], [NED_1[0], NED_4[0]], [-NED_1[2], -NED_4[2]], 'k')
plot_plane.plot([NED_1[1], NED_5[1]], [NED_1[0], NED_5[0]], [-NED_1[2], -NED_5[2]], 'k')
plot_plane.plot([NED_2[1], NED_3[1]], [NED_2[0], NED_3[0]], [-NED_2[2], -NED_3[2]], 'k')
plot_plane.plot([NED_4[1], NED_5[1]], [NED_4[0], NED_5[0]], [-NED_4[2], -NED_5[2]], 'k')
plot_plane.plot([0, ax_NED_1[1]], [0, ax_NED_1[0]], [0, -ax_NED_1[2]], 'r', label = 'x')
plot_plane.plot([0, ax_NED_2[1]], [0, ax_NED_2[0]], [0, -ax_NED_2[2]], 'g', label = 'y')
plot_plane.plot([0, ax_NED_3[1]], [0, ax_NED_3[0]], [0, -ax_NED_3[2]], 'b', label = 'z')
plot_plane.set_xlabel('East')
plot_plane.set_ylabel('North')
plot_plane.set_zlabel('Up')
plot_plane.legend()
plt.show()