2022년 파이썬 입문 중간고사 해설
import numpy as np
import matplotlib.pyplot as plt
주의: 문제에 조건이 있는 경우 조건을 준수할 것
(1)
a의 type을 bool로 바꾸어라.
a=1.0
(풀이)
bool(a)
(2)-(6)
아래의 문자열을 고려하자.
test_arr = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== schacon@mylaptop.local'
(2)
위 문자열에서 짝수번째 원소를 출력하는 코드를 작성하라.
(풀이)
test_arr[1::2]
(3)
위 문자열에서 마지막 10개의 원소를 출력하는 코드를 작성하라.
(풀이)
test_arr[-10:]
(4)
위 문자열을 뒤집은 문자열을 구하는 코드를 작성하라. 즉 아래를 출력하는 코드를 작성하라.
'lacol.potpalym@nocahcs ==Q7M+frw9iFRrNxbsSVqMlTarQ10d1os2njkImtaKn1+3r3wg+b8li/Z68Ec2DryauLMVmPZ98IPTnPZO4WA+ZmnE/trewr0bP/wv6ybNYjvDNpyX88XrrpKJQjlFUuz1bmFIe/86wW0V3+5x9Q1McnsAoJoaF3tAX7/KVlSvFMdsdwQANsjR6V8qLicMsZAHpXhKn1XixqBtiRXF3oAH+RCFXWlByTM/JdOk7vbP3adc0gwSppPbkVQ5XFl9h4fVELElx7MzQivrFUhbj9WJ4HJ81we5Zy4Idh7WYTDHlzfan+lPGUSDWB/mojT9KGTLNpITmrbS71YHfrHDkpUOlkAEQAAAwIBAAAAE2cy1CazN3BAAAA asr-hss'
(풀이)
test_arr[::-1]
(5)
위 문자열에서 대문자의 수를 count하라.
(풀이)
sum([s.isupper() for s in test_arr])
hint .isupper() 메소드를 이용할 것.
'a'.isupper()
'A'.isupper()
'='.isupper()
'@'.isupper()
(6)
위 문자열에서 사용된 문자 및 특수문자의 종류는 모두 몇가지 인가?
(풀이)
len(set(test_arr))
note1: 문자열 'AAB @ab' 에서 사용된 문자는 'A', 'B', ' ', '@', 'a', 'b' 이므로 모두 6종류의 문자 및 특수문자가 사용되었다.
note2: ' ', '+', '-', '.', '/', '=', '@', '1', 'a', 'A' 등을 모두 다른 문자로 취급한다.
(7)
리스트컴프리헨션을 이용하여 아래와 같은 리스트를 생성하라
['a',
'aa',
'aaa',
'aaaa',
'aaaaa',
'aaaaaa',
'aaaaaaa',
'aaaaaaaa',
'aaaaaaaaa',
'aaaaaaaaaa'] <- a가 10개있음
(풀이)
['a'*i for i in range(1,11)]
*
연산, 리스트컴프리헨션
(8)
길이가 1인 튜플을 만들어 자신의 학번을 저장하라. 길이가 1인 튜플을 만들어 자신의 영문이름을 저장하라. 두 튜플을 +
연산자로 합쳐아래와 같은 출력결과를 얻어라.
(202143052,'guebin')
(풀이)
a=(202143052,)
b=('guebin',)
a+b
+
연산, 길이가 1인 튜플
(9)
아래와 같은 list가 있다고 하자.
test_lst = [['g',1],['u',5],['e',2],['b',8],['i',2],['n',9]]
test_lst와 리스트컴프리헨션을 이용하여 아래를 출력하는 코드를 구현하라.
['g', 'uuuuu', 'ee', 'bbbbbbbb', 'ii', 'nnnnnnnnn']
(풀이)
test_lst = [['g',1],['u',5],['e',2],['b',8],['i',2],['n',9]]
[i*j for i,j in test_lst]
+
연산, 리스트 컴프리헨션
(10)
다음은 학생들의 출석,레포트,중간고사,기말고사 점수를 입력으로 하여 학점을 계산하는 함수이다.
def grade(attendance, report, mid, final):
if attendance<70:
credit = 'F'
else:
total_score = attendance * 0.1 + report * 0.2 + mid * 0.3 + final * 0.4
if total_score > 80:
credit = 'A+'
else:
credit = 'B0'
return credit
아래는 학생들의 학번, 출석점수, 레포트, 중간고사, 기말고사 점수가 입력된 리스트이다.
data = [['202212345', [100,95,25,90]],
['202212346', [60,90,95,95]],
['202212347', [50,90,45,35]],
['202212348', [90,90,50,75]],
['202212349', [100,95,85,85]],
['202212350', [90,90,100,95]],
['202212351', [100,95,100,95]],
['202212352', [95,85,80,60]],
['202212353', [100,90,60,55]],
['202212354', [100,85,70,95]],
['202212355', [100,95,40,100]]]
아래의 ???를 적절하게 완성하여 학생들의 학점을 계산하는 코드를 완성하라.
[grade(???) for _, scores in data]
(풀이)
[grade(*scores) for _, scores in data]
_
, 언패킹연산자 *
, for문과 튜플언패킹, 리스트컴프리헨션
(11)
길이가 0인 문자열을 선언하라.
(풀이)
len('')
(12)-(15)
(12)
dir(plt)와 dir(np)를 각각 실행하라. 실행결과를 각각 a,b로 저장하라. a,b의 type은 무엇인가?
(풀이)
a=dir(plt)
b=dir(np)
type(a),type(b)
(13)
a의 원소와 b의 원소의 수를 각각 구하라.
(풀이)
len(a),len(b)
(14)
a와 b의 공통원소의 수를 구하라.
(풀이)
len(set(a)&set(b))
(15)
a와 b의 원소를 합친 리스트를 만들어라. (공통원소는 중복하여 합치지 않는다)
(풀이)
lst = list(set(a)|set(b))
(16)-(18) 아래와 같은 dictionary가 있다.
test_dic = {'202212345': {'att':100,'rep':95,'mid':25,'fin':90},
'202212346': {'att':60,'rep':90,'mid':95,'fin':95},
'202212347': {'att':50,'rep':90,'mid':45,'fin':35},
'202212348': {'att':90,'rep':90,'mid':50,'fin':75},
'202212349': {'att':100,'rep':95,'mid':85,'fin':85},
'202212350': {'att':90,'rep':90,'mid':100,'fin':95},
'202212351': {'att':100,'rep':95,'mid':100,'fin':95},
'202212352': {'att':95,'rep':85,'mid':80,'fin':60},
'202212353': {'att':100,'rep':90,'mid':60,'fin':55},
'202212354': {'att':100,'rep':85,'mid':70,'fin':95},
'202212355': {'att':100,'rep':95,'mid':40,'fin':100}}
여기에서 202212345
등은 학번을, att는 출석점수, rep는 레포트점수, mid는 중간고사점수, fin은 기말고사 점수를 의미한다.
(16)
get 메소드를 이용하여 202212353에 해당하는 학생의 성적을 아래와 같이 리턴하라.
{'att': 100, 'rep': 90, 'mid': 60, 'fin': 55}
(풀이)
test_dic.get('202212353')
(17)
202212354의 레포트 점수를 리턴하라.
(풀이)
test_dic['202212354']['rep']
(18)
학생들의 학번을 리턴하는 코드를 작성하라.
(풀이)
[k for k in test_dic]
(19)
shape이 ()인 numpy이 array를 만들어라. (즉 차원이 0인 np.array를 만들어라)
(풀이)
np.array(3).shape
(20)
shape이 (2,2)인 단위행렬을 만들어라.
(풀이)
np.array([[1,0],[0,1]])
(21)
a의 모든 원소에 1을 더하는 코드를 작성하라.
a=[1,3,2,5,-3,3,8,2,3,1]
(풀이)
np.array([1,3,2,5,-3,3,8,2,3,1])+1
(22)
아래와 같은 수열을 생성하라.
1,3,6,10,15,21,28,36,45, ... , 378, 406, 435
hint: 이 수열에서 $a_n-a_{n-1}=n, ~n\geq 2$ 이다. 즉 3-1=2, 6-3=3, 10-6=4, ...
(풀이)
435-406
np.arange(1,30).cumsum()
(23)
아래와 같은 수열을 생생성하라.
0,1,2,3,4,5,...,99
위의 수열에서 1,4,7,10,13,... 번째의 원소를 뽑아라. (첫번째 원소는 0이다)
(풀이)
np.arange(100)[::3]
(24)
numpy를 이용하여 아래의 역행렬을 구하라.
$$\begin{bmatrix}
1& 0 \\
0& 3
\end{bmatrix}$$
(풀이)
np.linalg.inv(np.array([[1,0],[0,3]]))
(25)-(30)
a,b가 아래와 같이 주어졌다고 하자.
a=[1]*10
b=[2]*10
(25)
a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
(풀이)
np.concatenate([a,b])
(26)
a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2],
[2]])
(풀이)
np.concatenate([np.array(a).reshape(-1,1),np.array(b).reshape(-1,1)])
(27)
a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]
(풀이)
np.concatenate([np.array(a).reshape(1,-1),np.array(b).reshape(1,-1)])
(28)
a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.
array([[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2]])
(풀이)
np.concatenate([np.array(a).reshape(-1,1),np.array(b).reshape(-1,1)],axis=1)
(29)
a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]
(풀이)
np.stack([a,b])
(30)
a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.
array([[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 2]])
(풀이)
np.stack([a,b],axis=1)
(31)
아래와 같은 배열이 있다고 하자.
a=np.array([1,2,3,4,5])
b=np.array([3,2,1,1,2])
numpy의 @
연산자를 이용하여 $\sum_{i=1}^{5}a_ib_i$를 계산하라.
(풀이)
a@b
(32)
아래와 같은 배열을 생성하라.
x=np.random.randn(100)
numpy의 @
연산자를 이용하여 $\sum_{i=1}^{100}x_i^2$을 계산하라.
(풀이)
x=np.random.randn(100)
x@x
(33)
아래와 같은 배열을 생성하라.
a=np.array([1/100]*100)
x=np.random.randn(100)
numpy의 @
연산자를 이용하여 $\frac{1}{n}\sum_{i=1}^{n}x_i$를 계산하라.
(풀이)
a=np.array([1/100]*100)
x=np.random.randn(100)
a@x
(34)
표준정규분포에서 100개의 난수를 생성하라.
(풀이)
np.random.randn(100)
(35)
아래와 동일한 코드를 np.random.rand()로 구현하라.
np.random.uniform(low=2,high=4,size=(5,))
(풀이)
np.random.rand(5)*2+2
(36)
아래와 같은 배열을 선언하라.
a=np.random.randn(100)
np.where를 이용하여 a의 모든 음수를 0으로 바꾸는 코드를 작성하라.
(풀이)
a=np.random.randn(100)
np.where(a<0,0,a)
(37)
아래와 같은 배열을 선언하라.
a=np.random.randn(100)
위 배열의 최소값이 위치한 index를 return하라.
(풀이)
a=np.random.randn(100)
np.where(a==np.min(a))
(38)
아래와 같은 배열을 선언하라.
a=np.arange(12).reshape(3,4)
a
차원의 수를 유지하면서 1열을 추출하는 코드를 작성하라. 즉 결과가 아래와 같이 나오도록 하라.
array([[0],
[4],
[8]])
(풀이)
a[:,[0]]
(39)-(40)
(39)
자신의 학번으로 random seed 를 설정하라. [20,25)의 범위에서 100개의 정수를 랜덤으로 생성해 (10,10) shape의 배열을 만들어라.
(풀이)
np.random.seed(43052)
a=np.random.randint(low=20,high=25,size=(10,10))
(40)
39의 결과에서 20,21,22 는 각각 몇개씩 있는가?
(풀이)
np.sum(a==20),np.sum(a==21),np.sum(a==22)
(1)-(6) 아래의 코드를 실해하여 test_dic를 생성하라.
np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,200)
rep = np.random.choice(np.arange(5,21)*5,200)
mid = np.random.choice(np.arange(0,21)*5,200)
fin = np.random.choice(np.arange(0,21)*5,200)
key = ['202212'+str(s) for s in np.random.choice(np.arange(300,501),200,replace=False)]
test_dic = {key[i] : {'att':att[i], 'rep':rep[i], 'mid':mid[i], 'fin':fin[i]} for i in range(200)}
del(att);del(rep);del(mid);del(fin);del(key)
여기에서 202212345
등은 학번을, att는 출석점수, rep는 레포트점수, mid는 중간고사점수, fin은 기말고사 점수를 의미한다.
(1)
test_dic에서 출석점수가 70이상(70>=)인 학생들의 학번을 출력하는 코드를 작성하라.
(풀이)
ids= [k for k in test_dic if test_dic[k]['att']>=70]
(2)
test_dic에서 출석점수가 70미만(<70)인 학생들의 수를 구하라.
(풀이)
len([k for k in test_dic if test_dic[k]['att']<70])
sum([test_dic[k]['att']<70 for k in test_dic])
(3)
test_dic에서 출석점수가 70이상(70>=)인 학생들의 중간고사 점수의 평균을 계산하라.
(풀이)
np.mean([test_dic[k]['mid'] for k in test_dic if test_dic[k]['att']>=70])
(4)
test_dic에서 중간고사 점수를 출력하는 코드를 작성하라.
(풀이)
mid=[test_dic[k]['mid'] for k in test_dic]
(5)
test_dic에서 중간고사 점수의 표준편차와 레포트점수의 표준편차를 구하여라. 어떤것이 더 큰가?
(풀이)
np.std([test_dic[k]['mid'] for k in test_dic]),np.std([test_dic[k]['rep'] for k in test_dic])
(6)
test_dic에서 중간고사 점수가 가장 높은 사람의 학번을 출력하라.
(풀이)
[k for k in test_dic if test_dic[k]['mid']==max(mid)]
주의: att,rep,mid,fin,key를 실행하여 소멸시키지 않고 그대로 이용하거나 np.random.choice()를 이용하여 재생성한 뒤 계산할 경우 0점 처리함.
- 예를들면 (5)의 경우 np.std(mid), np.std(rep) 와 같은 식으로 구현하면 0점 처리함.
(7)
성공확률이 0.45인 시행이 있다고 하자. 이 시행을 100번의 시행하였을 경우 73번 이상 성공할 확률은 얼마인가? 시뮬레이션을 이용하여 근사계산하라.
(풀이)
sum(np.random.binomial(n=100,p=0.45,size=(1000,)) >= 73)
(8)
성공확률이 0.45인 시행이 있다고 하자. 이 시행을 100번 시행하였을 경우 10번이하로 실패하거나 90번이상 성공할 확률은 얼마인가? 시뮬레이션을 이용하여 근사계산하라.
(풀이)
a=np.random.binomial(n=100,p=0.45,size=(1000,))
sum((a>=90) | (a<=10))
sum(a>=90) + sum(a<=10) # 이것도 좋은 풀이
(9)
아래와 같은 행렬을 선언하자.
A=np.arange(2*1).reshape(2,1)
B=np.arange(2*2).reshape(2,2)
C=np.arange(2*3).reshape(2,3)
D=np.arange(3*3).reshape(3,3)
E=np.arange(3*2).reshape(3,2)
F=np.arange(3*1).reshape(3,1)
아래의 블락매트릭스를 만들어라.
$\begin{bmatrix} a_{11} & b_{11} & b_{12} & c_{11} & c_{12} & c_{13} \\ a_{21} & b_{21} & b_{22} & c_{21} & c_{22} & c_{23} \\ d_{11} & d_{12} & d_{13} & e_{11} & e_{12} & f_{11} \\ d_{21} & d_{22} & d_{23} & e_{21} & e_{22} & f_{21} \\ d_{31} & d_{32} & d_{33} & e_{31} & e_{32} & f_{31} \end{bmatrix}$
여기에서 $a_{ij}$는 매트릭스 ${\bf A}$의 원소이다.
(풀이)
top = np.concatenate([A,B,C],axis=1)
bottom = np.concatenate([D,E,F],axis=1)
np.concatenate([top,bottom],axis=0)
(10)
표준정규분포에 10000개의 난수를 아래와 같이 생성하라.
x=np.random.randn(10000)
y=np.random.randn(10000)
$(i,j)$ 번째 원소가 $(x_i-y_j)^2$인 (10000,10000) 매트릭스를 만들어라.
(풀이)
(x.reshape(10000,1) - y.reshape(1,10000))**2
(11)-(16)
아래와 같은 매트릭스를 생성하라.
np.random.seed(43052)
a=np.random.randn(10000).reshape(100,100)
a
(11)
각 행의 합을 구하라. 즉 1행의 합, 2행의 합, ... 100행의 합을 계산하라.
- 1행의합 = 0.38342049 + 1.0841745 + ... + 1.18701443
(풀이)
a.sum(axis=1)
(12)
(11)
의 결과로 나온 배열의 표준편차를 구하라.
(풀이)
a.sum(axis=1).std()
(13)
각 열의 평균을 구하라. 즉 1열의 평균, 2열의 평균, ... , 100열의 평균을 계산하라.
(풀이)
a.sum(axis=0)
(14)
(13)
의 결과로 나온 배열의 표준편차를 구하라.
(풀이)
a.sum(axis=0).std()
(15)
a의 원소중 a>0 을 만족하는 원소의 평균을 구하여라.
(풀이)
a[a>0].mean()
(16)
a의 원소중 a>3을 만족하는 원소의 수를 count하라.
(풀이)
np.sum(a>3)
(17)-(18)
아래와 같은 배열 a를 고려하자.
np.random.seed(43052)
a=np.random.binomial(1,0.2,size=(10000,))
a
(17)
0에서 1로 바뀌는 부분을 count하라.
(풀이)
np.sum(np.diff(a)==1)
(18)
1에서 0으로 바뀌는 부분을 count하라.
(풀이)
np.sum(np.diff(a)==-1)
[예시] 아래의 배열에서 0에서 1로 부분은 모두 세 군데이고, 1에서 0으로 바뀌는 부분은 모두 두 군데 이다.
0 0 0 1 0 1 0 0 0 1 1 1
(19)-(25)
(19)
$i=1,2,\dots,1000$에 대하여 아래를 각각 구하라.
$$x_i= \cos(t_i)+\cos(3t_i)+\cos(5t_i)$$
$$y_i= \sin(t_i)+\sin(4t_i)$$
여기에서 $t_i=\frac{2\pi i }{1000}$ 이다.
(풀이)
i=np.arange(1,1001)
t=i*2*np.pi/1000
x=np.cos(t)+np.cos(3*t)+np.cos(5*t)
y=np.sin(t)+np.sin(4*t)
(20)
$(x_i,y_i)$를 그려라.
(풀이)
plt.plot(x,y)
(21)
아래와 같은 변환을 통하여 $(w_i,z_i)$를 얻어라.
$$w_i= \frac{1}{\sqrt{2}}x_i - \frac{1}{\sqrt{2}}y_i$$
$$z_i= \frac{1}{\sqrt{2}}x_i + \frac{1}{\sqrt{2}}y_i$$
$(w_i,z_i)$를 시각화 하라.
(풀이)
w = 1/np.sqrt(2)*x - 1/np.sqrt(2)*y
z = 1/np.sqrt(2)*x + 1/np.sqrt(2)*y
plt.plot(w,z)
(22)
아래와 같은 매트릭스를 만들어라.
(풀이)
A=np.stack([x,y]).T
A
A=np.stack([x,y],axis=1)
A
(23)
${\bf A} {\bf B}$의 첫번째 열과 두번째 열을 시각화한 결과가 $(w_i,z_i)$과 동일하도록 적당한 (2,2) 매트릭스 ${\bf B}$를 만들어라.
(풀이)
B= np.array([[1/np.sqrt(2), 1/np.sqrt(2)],[-1/np.sqrt(2), 1/np.sqrt(2)]])
#B= np.array([[1, 1],[-1, 1]])/np.sqrt(2)
plt.plot(A@B[:,0],A@B[:,1])
(24)
${\bf A}{\bf B}^2$의 첫번째 열과 두번째 열을 시각화 하라.
(풀이)
plt.plot((A@B@B)[:,0],(A@B@B)[:,1])
(25)
$n=3,4,5,6,\dots$ 에 대하여 ${\bf A}{\bf B}^n$을 반복적으로 그려보라. $(x_i,y_i)$의 시각화 결과와 동일한 가장 작은 $n$은 얼마인가? $(w_i,z_i)$의 시각화 결과와 동일한 가장 작은 $n$은 얼마인가?
(풀이)
plt.plot((A@B@B@B)[:,0],(A@B@B@B)[:,1]) ## n=3
plt.plot((A@B@B@B@B)[:,0],(A@B@B@B@B)[:,1]) ## n=4
(B@B)@(B@B)@(B@B)@(B@B)
(B@B)@(B@B)@(B@B)@(B@B)@B
- 답: $(x_i,y_i)$의 시각화 결과와 동일한 가장 작은 $n=8$ 이고 $(w_i,z_i)$의 시각화 결과와 동일한 가장 작은 $n=9$ 이다.
(1)
아래는 python을 설치하는 방법을 소개한 url 이다. 직접 url에 들어가서 설치하는 방법을 읽어보고 곤이, 철용, 아귀, 짝귀 중 옳은말을 한 사람을 모두 골라라.
(곤이) 해당 방법은 아나콘다를 이용하여 파이썬을 설치하는 방법이다.
(철용) 그래서 이 방법으로는 가상환경을 만들 수 없겠군.
(아귀) 위 url에 제시된 방법으로 설치하면 주피터가 자동설치 된다.
(짝귀) 따라서 위의 방법으로 설치하면 IDE는 주피터만 사용할 수 있다.
(2)
곤이는 1부터 10까지의 합을 구하는 코드를 작성하기 위하여 아래와 같이 mysum.py
파일을 만들었다.
## mysum.py
total = 0
for i in range(1,11):
total = total + i
print(total)
곤이의 컴퓨터는 윈도우이며 아니콘다를 이용해 파이썬을 설치하였다고 가정한다. 다음중 옳은 설명을 한 사람을 모두 고르라.
(곤이) mysum.py를 실행하기 위해서는 anaconda prompt 에서 mysum.py가 위치한 폴더로 이동한 뒤 %run mysum.py 를 실행하면 된다.
(철용) anaconda prompt 에서 mysum.py가 위치한 폴더로 이동한 뒤 ipython을 실행하고 %run mysum.py을 실행해도 된다.
(아귀) 철용의 방법에서 %run mysum.py 대신에 !python mysum.py를 쳐도 동작한다.
(짝귀) 하지만 다른 가상환경을 만들 경우 철용과 아귀의 방법으로 실행할 수 없다는 단점이 있다.