5.1 for 반복문을 이해하기 위해 다음과 같이 여러 수에서 특정한 수를 뽑아 내어 보자.
a) for 반복문과 range()를 이용하여 1에서 100까지의 수 중에서 홀수를 아래와 같이 출력하는 프로그램을 작성하여라.
b) while 반복문을 사용하여 1에서 100까지의 수 중에서 홀수를 출력하는 프로그램을 작성하여라.
1에서 100까지의 수 중에서 홀수는 :
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
c) 앞에서 만들어 본 a), b)의 코드를 변형하여 for 반복문 또는 while 반복문을 사용하여 1에서 100사이의 수 중에서 짝수를 출력하는 프로그램을 작성하여라.
1에서 100까지의 수 중에서 짝수는 :
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
# your code here
# 5.1-a
print('1에서 100까지의 수 중에서 홀수는 :')
for i in range(1, 101):
if i%2 == 1:
print(i, end = ' ')
# 5.1-b
print('\n1에서 100까지의 수 중에서 홀수는 :')
num = 1
while num <= 100:
if num%2 == 1:
print(num, end = ' ')
num = num + 1
# 5.1-c
print('\n1에서 100까지의 수 중에서 짝수는 :')
for i in range(1, 101):
if i%2 == 0:
print(i, end = ' ')
1에서 100까지의 수 중에서 홀수는 : 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 1에서 100까지의 수 중에서 홀수는 : 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 1에서 100까지의 수 중에서 짝수는 : 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
5.2 반복문을 활용하여 특정 구간의 수의 합을 구할 수 있다.
a) for 반복문 또는 while 반복문을 사용하여 1에서 100까지의 정수 중에서 홀수의 합을 출력하는 프로그램을 작성하여라.
1에서 100까지의 수 중에서 홀수의 합 : 2500
b) for 반복문 또는 while 반복문을 사용하여 1에서 100까지의 정수 중에서 짝수의 합을 출력하는 프로그램을 작성하여라.
1에서 100까지의 수 중에서 짝수의 합 : 2550
c) 사용자로부터 시작 정수와 끝 정수를 입력으로 받은 다음 시작 정수 값에서 끝 값까지의 합을 구하여 다음과 같이 출력하는 프로그램을 작성하여라.
시작 정수를 입력하세요 : 2
끝 정수를 입력하세요 : 6
2 에서 6 까지 정수의 합 : 20
# your code here
# 5.2-a
sum = 0
for i in range(1, 101):
if i%2 == 1:
sum = sum + i
print('1에서 100까지의 수 중에서 홀수의 합 :', sum)
# 5.2-b
num = 1
sum = 0
while num <= 100:
if num%2 == 0:
sum = sum + num
num = num + 1
print('1에서 100까지의 수 중에서 짝수의 합 :', sum)
# 5.2-c
num1 = int(input('시작 정수를 입력하세요 : '))
num2 = int(input('끝 정수를 입력하세요 : '))
sum = 0
for i in range(num1, num2 + 1):
sum = sum + i
print(num1, '에서', num2, '까지 정수의 합 :', sum)
1에서 100까지의 수 중에서 홀수의 합 : 2500 1에서 100까지의 수 중에서 짝수의 합 : 2550 시작 정수를 입력하세요 : 2 끝 정수를 입력하세요 : 6 2 에서 6 까지 정수의 합 : 20
5.3 맛나 식당의 메뉴 주문 프로그램을 개발하고자 한다. 이를 위하여 사용자에게 다음과 같은 1), 2), 3)의 메뉴를 보여주고 이 중에서 하나를 선택하도록 하자. 이때 아래 보기와 같이 메뉴에 없는 5, 6, 0과 같은 숫자가 입력되면 '메뉴를 다시 입력하세요: '가 출력되도록 한 후 다시 입력을 받도록 하자.
만나 식당에 오신 것을 환영합니다. 메뉴는 다음과 같습니다.
1) 햄버거
2) 치킨
3) 피자
1에서 3까지의 메뉴를 선택하세요 : 5
메뉴를 다시 입력하세요: 6
메뉴를 다시 입력하세요: 0
메뉴를 다시 입력하세요: 2
치킨을 선택하였습니다.
# your code here
print('만나 식당에 오신 것을 환영합니다. 메뉴는 다음과 같습니다.\n1) 햄버거\n2) 치킨\n3) 피자')
menu = int(input('1에서 3까지의 메뉴를 선택하세요 : '))
while menu <= 1 or menu >= 3:
menu = int(input('메뉴를 다시 입력하세요: '))
if menu == 1:
print('햄버거를 선택하였습니다.')
elif menu == 2:
print('치킨을 선택하였습니다.')
else:
print('피자를 선택하였습니다.')
만나 식당에 오신 것을 환영합니다. 메뉴는 다음과 같습니다. 1) 햄버거 2) 치킨 3) 피자 1에서 3까지의 메뉴를 선택하세요 : 5 메뉴를 다시 입력하세요: 6 메뉴를 다시 입력하세요: 0 메뉴를 다시 입력하세요: 2 치킨을 선택하였습니다.
5.4 사용자로부터 정수를 입력받아 다음과 같은 삼각형을 출력하는 프로그램을 작성하시오. 이때 숫자 5가 입력되면 높이가 5이고 제일 마지막에 줄의 별이 5개가 삼각형 형태로 나타나도록 하시오.
*
**
***
****
*****
# your code here
count = 1
for i in range(0, 5):
for j in range(0, count):
if j == count - 1:
print('*')
else:
print('*', end = '')
count = count + 1
* ** *** **** *****
5.5 깊이가 30m인 우물이 있다. 이 우물에 사는 달팽이는 하루 종일 기어서 올라가면 7m를 올라갈 수 있다. 그러나 밤이 되어 휴식을 취하는 동안 5m를 미끄러져 내려간다. 이 우물을 벗어나는데 며칠의 시간이 걸릴까? while 문을 이용하여 매일 저녁 달팽이의 위치를 다음과 같이 구하시오(주의: 하루에 7 - 5 = 2m를 올라갈 것이라고 단순 계산하면 안된다. 이 경우 15일 되는 날 탈출하는 것으로 계산되지만 실제로는 13일이면 된다).
day : 1 달팽이의 위치 : 7 m
day : 2 달팽이의 위치 : 9 m
day : 3 달팽이의 위치 : 11 m
day : 4 달팽이의 위치 : 13 m
day : 5 달팽이의 위치 : 15 m
day : 6 달팽이의 위치 : 17 m
day : 7 달팽이의 위치 : 19 m
day : 8 달팽이의 위치 : 21 m
day : 9 달팽이의 위치 : 23 m
day : 10 달팽이의 위치 : 25 m
day : 11 달팽이의 위치 : 27 m
day : 12 달팽이의 위치 : 29 m
day : 13 달팽이의 위치 : 31 m
축하합니다. 우물을 탈출하였습니다.
우물을 탈출하는 데 걸린 날은 13 일입니다.
# your code here
depth = 30
height = 0
day = 1
while 1:
height = height + 7
print('day :', day, '달팽이의 위치 :', height, 'm')
if height >= 30:
break
height = height - 5
day = day + 1
print('축하합니다. 우물을 탈출하였습니다.')
print('우물을 탈출하는 데 걸린 날은', day, '일입니다.')
day : 1 달팽이의 위치 : 7 m day : 2 달팽이의 위치 : 9 m day : 3 달팽이의 위치 : 11 m day : 4 달팽이의 위치 : 13 m day : 5 달팽이의 위치 : 15 m day : 6 달팽이의 위치 : 17 m day : 7 달팽이의 위치 : 19 m day : 8 달팽이의 위치 : 21 m day : 9 달팽이의 위치 : 23 m day : 10 달팽이의 위치 : 25 m day : 11 달팽이의 위치 : 27 m day : 12 달팽이의 위치 : 29 m day : 13 달팽이의 위치 : 31 m 축하합니다. 우물을 탈출하였습니다. 우물을 탈출하는 데 걸린 날은 13 일입니다.
5.6 다음과 같이 자동차의 연료 탱크 프로그램을 시뮬레이션하여 보자. 초기 연료의 양은 500으로 두자. 사용자가 주행을 하면 연료가 줄어들고 충전을 하면 연료가 증가한다. 이때 연료의 사용과 충전은 -/+ 기호와 함께 입력하도록 한다. 반복문을 사용하여 사용자로부터 충전 또는 사용한 연료를 입력받아서 현재 남아있는 양을 계속 출력하고, 연료 탱크에 남아있는 연료가 10% 미만이면 경고를 출력하고 프로그램 수행을 마친다.
충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: +60
현재 탱크양은 560입니다.
충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: -300
현재 탱크양은 260입니다.
충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: -220
현재 탱크양은 40입니다.
경고 : 연료가 10% 미만이니 충전하세요!
# your code here
init = 500
fuel = init
while fuel >= init*0.1:
dev = int(input('충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: '))
fuel = fuel + dev
print('현재 탱크양은', fuel, '입니다.')
print('경고 : 연료가 10% 미만이니 충전하세요!')
충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: +60 현재 탱크양은 560 입니다. 충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: -300 현재 탱크양은 260 입니다. 충전 또는 사용한 연료를 +/- 기호와 함께 입력하시오: -220 현재 탱크양은 40 입니다. 경고 : 연료가 10% 미만이니 충전하세요!
5.7 암스트롱 수란 $xyz$로 표시되는 세 자리의 정수 중에서 각 자리의 수를 세제곱한 수의 합과 자신이 같은 수를 말하며 다음과 같은 조건을 만족한다. $$ 100x+10y+z=x^3+y^3+z^3 $$ 구체적인 예를 들면 153은 1 + 125 + 27의 합으로 구성될 수 있는데 이러한 수가 암스트롱 수이다. 세 자리 정수들 중에서 모든 암스트롱 수를 구하여 다음과 같이 출력하여라.
세 자리의 암스트롱 수 : 153 370 371 407
# your code here
print('세 자리의 암스트롱 수 : ', end = '')
for num in range(100, 1000):
n1 = num//100
n2 = (num - n1*100)//10
n3 = num - n1*100 - n2*10
if num == n1**3 + n2**3 + n3**3:
print(num, end = ' ')
세 자리의 암스트롱 수 : 153 370 371 407
5.8 거꾸로 정수는 121이나 3443와 같이 거꾸로 나열해도 그 값이 원래의 값과 같은 정수를 말한다. 사용자로부터 임의의 양의 정수를 입력받아 이 수가 거꾸로 정수인지 아닌지를 판단하는 다음과 같은 프로그램을 작성하시오. 입력을 받을 때 -99가 들어올 경우 더 이상 입력을 받지 않는다.
정수를 입력하시오 : 3443
3443은(는) 거꾸로 정수입니다.
정수를 입력하시오 : 324
324은(는) 거꾸로 정수가 아닙니다.
정수를 입력하시오 : -99
프로그램을 종료합니다.
# your code here
while 1:
num = int(input('정수를 입력하시오 : '))
if num == -99:
print('프로그램을 종료합니다.')
break
digit = 1
while 1:
if num // 10**(digit - 1) == 0:
break;
else:
digit = digit + 1
digit = digit - 1
temp_num = num
temp_digit = digit
check = 0
if digit%2 == 0:
for i in range(1, digit//2 + 1):
#print(temp_num, temp_digit)
high = temp_num//10**(temp_digit - 1)
low = (num%(10**i) - num%(10**(i - 1)))//10**(i - 1)
temp_num = temp_num - high*10**(temp_digit - 1)
temp_digit = temp_digit - 1
if high == low:
check = check + 1
if check == digit//2:
print(num, '은(는) 거꾸로 정수입니다.')
else:
print(num, '은(는) 거꾸로 정수가 아닙니다.')
else:
for i in range(1, digit//2 + 2):
#print(temp_num, temp_digit)
high = temp_num//10**(temp_digit - 1)
low = (num%(10**i) - num%(10**(i - 1)))//10**(i - 1)
temp_num = temp_num - high*10**(temp_digit - 1)
temp_digit = temp_digit - 1
if high == low:
check = check + 1
if check == digit//2 + 1:
print(num, '은(는) 거꾸로 정수입니다.')
else:
print(num, '은(는) 거꾸로 정수가 아닙니다.')
정수를 입력하시오 : 3443 3443 은(는) 거꾸로 정수입니다. 정수를 입력하시오 : 324 324 은(는) 거꾸로 정수가 아닙니다. 정수를 입력하시오 : -99 프로그램을 종료합니다.
5.9 사용자로부터 임의의 양의 정수를 입력받아 다음과 같이 입력된 정수의 개수와, 가장 큰 값, 가장 작은 값을 출력하도록 하자. 입력을 받을 때 -99가 들어올 경우 더 이상 입력을 받지 않는다.
정수를 입력하시오 : 34
정수를 입력하시오 : 920
정수를 입력하시오 : 320
정수를 입력하시오 : 30
정수를 입력하시오 : -99
4 개의 유효한 정수 중 가장 큰 정수는 920 이고, 가장 작은 정수는 30 입니다.
# your code here
counter = 0
while 1:
num = int(input('정수를 입력하시오 : '))
if num == -99:
print('프로그램을 종료합니다.')
break
if counter == 0:
big = num;
small = num;
else:
if num >= big:
big = num
elif num <= small:
small = num
counter = counter + 1
print(counter, '개의 유효한 정수 중 가장 큰 정수는', big, '이고, 가장 작은 정수는', small, '입니다.')
정수를 입력하시오 : 34 정수를 입력하시오 : 920 정수를 입력하시오 : 320 정수를 입력하시오 : 30 정수를 입력하시오 : -99 프로그램을 종료합니다. 4 개의 유효한 정수 중 가장 큰 정수는 920 이고, 가장 작은 정수는 30 입니다.
5.10 $Numerical~Integration,~Euler~Method$
수치적분은 어떤 함수 $f'(t)$을 수학적으로 적분할 수 없는 경우, 그 적분식 $f(t)$을 근사적으로 구하기 위해 사용하는 기법이다. 가장 단순한 수치적분 방법인 Euler method은 1st-order Taylor approximation에서 비롯되었으며, 그 식은 다음과 같다.
$$ f_{n+1} = f_n + f_n'\Delta t $$본 문제에서는 $f'(t) = \displaystyle\frac{df}{dt} = \cos(t)$ 인 경우에 대해 Euler method을 적용해 볼 것이다. 이 경우 적분 결과는 $f_\text{true}(t)=\sin(t)$임이 익히 알려져 있으므로, Euler method을 적용해 얻은 결과 $f_\text{calc}(t)$와의 비교를 통해 수치적분이 제대로 수행되었는지 확인할 수 있다.
0에서 10초까지의 시간을 0.1초 간격으로 쪼갠 결과를 변수 t에 저장하였다(Tf = 10, dt = 0.1). 이때 그 쪼개진 개수는 변수 N에 저장된다. 변수 f_deriv은 $f'(t) = \displaystyle\frac{df}{dt} = \cos(t)$에, f_true은 $f_\text{true}(t)=\sin(t)$, 그리고 f_calc은 수치적분 결과의 저장을 위해 미리 0으로 선언한 배열이다. $\displaystyle\frac{df}{dt}$와 그 적분식 $f_\text{true}(t)$을 그래프로 그린 결과는 아래 셀을 실행해 확인하라.
##### Don't modify this cell #####
import numpy as np
import matplotlib.pyplot as plt
# 변수 설정
Tf = 10 # 종료 시간
dt = 0.1 # 시간 간격
N = int(Tf/dt) + 1 # Tf을 dt로 쪼갠 개수
t = np.linspace(0, Tf, N) # 0에서 10초까지의 시간을 0.1초 간격으로 쪼갠 결과 (배열)
f_deriv = np.cos(t) # 미분된 함수 f'(t) = cos(t) (배열)
f_true = np.sin(t) # 적분 결과의 참값 f_true(t) = sin(t) (배열)
f_calc = np.zeros(N) # 적분 결과의 계산값 f_calc(t), 0으로 선언됨 (배열)
f_init = 0 # 적분 초기값 f_true(0) = f_calc(0) = sin(0) = 0
# 그래프 출력
plt.figure(figsize=(8,4))
plt.plot(t,f_deriv, '.-', label='df/dt')
plt.plot(t,f_true, '.-', label='f_true(t)')
plt.xlabel('time')
plt.grid()
plt.legend()
plt.show()
아래 그림은 적분 결과 f_calc를 계산하는 방법을 보여준다. 적분 초기값을 0이라 할 때$(f_0=f_\text{true}(0)=\sin(0)=0)$, 반복문을 사용하여 수치적분을 실시하는 코드를 아래 셀에 작성하시오(결과 비교를 위해 변수명을 f_calc로 설정할 것).
# your code here
for i in range(0, N):
if i == 0:
f_calc[i] = f_init
else:
f_calc[i] = f_calc[i - 1] + f_deriv[i - 1]*dt
아래 셀을 실행해 계산된 f_calc의 값들이 f_true의 값들과 비슷한지 확인한다.
##### Don't modify this cell #####
# 계산 결과 출력 및 비교
plt.figure(figsize=(8,4))
plt.plot(t,f_true, '.-', label='f_true(t)')
plt.plot(t,f_calc, '.-', label='f_calc(t)')
plt.xlabel('time')
plt.grid()
plt.legend()
plt.show()