수열: 규칙성을 가지고 나열되어 있는 수들

항들의 합과 항의 관계




< 파이썬 실습 >
inputN1 = int(input('a1 입력: '))
inputD = int(input('d(공차) 입력: '))
inputN = int(input('n 입력: '))
valueN = inputN1 + (inputN-1)*inputD
print(f'{inputN}번째 항의 값: {valueN}')
<Output>
a1 입력: 2
n 입력: 6
d(공차) 입력: 3
6번째 항의 값: 17
-----
inputN1 = int(input('a1 입력: '))
inputD = int(input('d(공차) 입력: '))
inputN = int(input('n 입력: '))
valueN = 0 #n번째 항의 값
n = 1
while n <= inputN:
if n == 1:
valueN = inputN1
print(f'{n}번째 항의 값: {valueN}')
n += 1
continue
valueN += inputD #공차를 점차적으로 더함
print(f'{n}번째 항의 값: {valueN}')
n += 1
print(f'입력하신 {inputN}번째에 해당하는 값은 {valueN}입니다.')
<Output>
a1 입력: 2
d(공차) 입력: 3
n 입력: 7
1번째 항의 값: 2
2번째 항의 값: 5
3번째 항의 값: 8
4번째 항의 값: 11
5번째 항의 값: 14
6번째 항의 값: 17
7번째 항의 값: 20
입력하신 7번째에 해당하는 값은 20입니다.
inputN1 = int(input('a1 입력: '))
inputD = int(input('d(공차) 입력: '))
inputN = int(input('n 입력: '))
# n번째 항의 값
valueN = inputN1 + (inputN-1)*inputD
# n번째 항까지의 합
sumN = inputN * (inputN1 + valueN)/2 #나눗셈의 결과는 항상 실수
print(f'{inputN}번째 항까지의 합은 {int(sumN)}입니다.')
<Output>
a1 입력: 5
d(공차) 입력: 4
n 입력: 3
3번째 항까지의 합은 27입니다.
inputN1 = int(input('a1 입력: '))
inputD = int(input('d(공차) 입력: '))
inputN = int(input('n 입력: '))
valueN = 0 #n번째 항의 값
sumN = 0
n = 1
while n <= inputN:
if n == 1:
valueN = inputN1
sumN += valueN
print(f'{n}번째 항의 값: {valueN}')
n += 1
continue
valueN += inputD #공차를 점차적으로 더함
sumN += valueN
print(f'{n}번째 항까지의 합: {sumN}')
n += 1
print(f'입력하신 {inputN}번째까지의 합은 {sumN}입니다.')
<Output>
a1 입력: 5
d(공차) 입력: 4
n 입력: 4
1번째 항의 값: 5
2번째 항까지의 합: 14
3번째 항까지의 합: 27
4번째 항까지의 합: 44
입력하신 4번째까지의 합은 44입니다.




<파이썬 실습>
# 등비수열: 일정한 비로 증가하는 숫자의 나열
inputN1 = int(input('a1 입력: '))
inputR = int(input('공비(r) 입력: '))
inputN = int(input('n 입력: '))
valueN = 0
n = 1
sumN = 0
nums = []
while n <= inputN:
if n == 1:
valueN = inputN1
sumN += valueN
nums.append(valueN)
n += 1
continue
valueN *= inputR
nums.append(valueN)
sumN += valueN
n += 1
print(f'{inputN}번째까지의 나열: {nums}')
print(f'{inputN}번째 항까지의 합: {sumN}')
# 등비수열 일반항 구하기 공식 사용하기: an = a1*r^(n-1)
valueN = inputN1 * (inputR ** (inputN-1))
print(f'[공식 사용] {inputN}번째 항의 값: {valueN}')
# 등비수열의 합 공식 사용하기: sn = a1 * (1-(r^n)/(1-r)
valueN = inputN1 * (1-(inputR**inputN)) / (1-inputR)
print(f'[공식 사용] {inputN}번째까지 항의 합: {int(sumN)}')
<Output>
a1 입력: 2
공비(r) 입력: 2
n 입력: 6
6번째까지의 나열: [2, 4, 8, 16, 32, 64]
6번째 항까지의 합: 126
[공식 사용] 6번째 항의 값: 64
[공식 사용] 6번째까지 항의 합: 126



# 계차수열
# an = {3, 7, 13, 21, 31, 43, 57}
# bn = {4, 6, 8, 10, 12, 14} => 공차라 2인 등차수열
inputAN1 = int(input('a1 입력: '))
inputAN = int(input('an 입력: '))
inputBN1 = int(input('b1 입력: '))
inputBD = int(input('bn의 공차(d) 입력: '))
valueAN = 0
valueBN = 0
n = 1
while n <= inputAN:
if n == 1 :
valueAN = inputAN1
valueBN = inputBN1
print(f'an의 {n}번째 항의 값: {valueAN}')
print(f'bn의 {n}번째 항의 값: {valueBN}')
n += 1
continue
valueAN = valueAN + valueBN
valueBN = valueBN + inputBD
print(f'an의 {n}번째 항의 값: {valueAN}')
print(f'bn의 {n}번째 항의 값: {valueBN}')
n += 1
<Output>
a1 입력: 3
an 입력: 7
b1 입력: 4
bn의 공차(d) 입력: 2
an의 1번째 항의 값: 3
bn의 1번째 항의 값: 4
an의 2번째 항의 값: 7
bn의 2번째 항의 값: 6
an의 3번째 항의 값: 13
bn의 3번째 항의 값: 8
an의 4번째 항의 값: 21
bn의 4번째 항의 값: 10
an의 5번째 항의 값: 31
bn의 5번째 항의 값: 12
an의 6번째 항의 값: 43
bn의 6번째 항의 값: 14
an의 7번째 항의 값: 57
bn의 7번째 항의 값: 16
-------
# 계차수열의 합: n^2 + n + 1 = an
# bn이 등차수열이니까 등차수열의 일반항 공식: bn = b1 + (n-1) * d
# bn = 4 + (n-1) * 2 = 2n + 2
# 등차수열 bn의 k-1까지의 합: n(b1 + bn) / 2 -> n에 k-1 대입
# (k-1) * (4 + (2(k-1) + 2)) / 2 = (k-1) * (2k +4) / 2 = (k-1)(k+2) = k^2 + k -2
# 1부터 (n-1)까지 bn의 합 = an - a1 -> an = a1 + (1부터 (n-1)까지 bn의 합)
# an = k^2 + k -2 + 3 = k^2 +k + 1
valueAN = inputAN ** 2 + inputAN + 1
print(f'[공식 사용] an의 {inputAN}번째 항의 값: {valueAN}')
<Output>
[공식 사용] an의 7번째 항의 값: 57

# 피보나치 수열: n3 = n2 + n1 ---> {1, 1, 2, 3, 5, 8, 13, 21 }
inputN = int(input('n번째 입력: '))
valueN = 0
sumN = 0
preN2 = 0 #2번째 전
preN1 = 0 #1번째 전 = 바로 이전
n = 1
while n <= inputN:
if n == 1 or n == 2:
valueN = 1
preN2 = valueN
preN1 = valueN
sumN += valueN # n==1, sumN = 1 ---> n==2, sumN = 1+1 =2
n += 1
else:
valueN = preN2 + preN1 #n=3, value= 이전+이이전 = 1+1 =2
# 다음 반복문을 위해 미리 처리
preN2 = preN1 # 다음 회차에 이이전의 값이 이전의 값이 되어야 하고
preN1 = valueN #바로 이전의 값은 현재 회차의 value값이 되어야 함
sumN += valueN
n += 1
print(f'{n}번째 항의 값: {valueN}')
print(f'{n}번째 항까지 값: {sumN}')
<Output>
n번째 입력: 6
7번째 항의 값: 8
7번째 항까지 값: 20

inputN = int(input('n 입력: '))
result = 1
for n in range(1, inputN+1): #5! = 5*4*3*2*1
result *= n
print(f'{inputN} 팩토리얼({inputN}!): {result}')
<Output>
n 입력: 5
5 팩토리얼(5!): 120
------------------------------------------
# n == 1이 될 때까지 factorialFun(n-1)에 들어가면서 함수를 호출하여 곱셈을 더할 수 있음
# factorialFun(3) 을 실행하면, 3 * factorialFun(2) = 3 * (2 * factorialFun(1)) = 3 * (2 * 1)
def factorialFun(n):
if n == 1:
return 1
return n * factorialFun(n-1)
print(f'{inputN} 팩토리얼({inputN}!): {factorialFun(inputN)}')
------------ math 내장함수 사용하기------------
import math
math.factorial(inputN)

<파이썬 실습>
inputN = int(input('n항 입력: '))
flag = True
n = 1; #1군부터 시작
nCnt = 1; #1군부터 시작
searchN = 0
while flag:
for i in range(1, (n+1)):
if i == n: #각 군의 끝 값이라면 ','없이 출력
print('{} '.format(i), end='')
else:
print('{}, '.format(i), end='')
nCnt += 1
if nCnt > inputN:
searchN = i #해당 군의 값을 출력
flag = False
break
print() #한 군이 다 돌아서 줄바꿈
n += 1
print('{}항: {}'.format(inputN, searchN))
<Output>
n항 입력: 13
1
1, 2
1, 2, 3
1, 2, 3, 4
1, 2, 3,
13항: 3


< 파이썬 실습 >
numN = int(input('N 입력: '))
numR = int(input('R 입력: '))
result = 1
for n in range(numN, (numN-numR), -1): #range의 최대를 numN-numR으로 설정해야, numN-numR+1까지 계산 가능
result *= n
print(f'n: {n}')
print(f'{numN}P{numR} result: {result}')
<Output>
N 입력: 8
R 입력: 3
n: 8
n: 7
n: 6
8P3 result: 336
------
N 입력: 7
R 입력: 5
n: 7
n: 6
n: 5
n: 4
n: 3
7P5 result: 2520
def calP(numN, numR):
result = 1
for n in range(numN, (numN-numR), -1): #range의 최대를 numN-numR으로 설정해야, numN-numR+1까지 계산 가능
result *= n
print(f'n: {n}')
print(f'{numN}P{numR} result: {result}')
return result
print(f'5P5 X 3P3 result: {calP(5,5) * calP(3,3)}')
<Output>
n: 5
n: 4
n: 3
n: 2
n: 1
5P5 result: 120
n: 3
n: 2
n: 1
3P3 result: 6
5P5 X 3P3 result: 720




print('[nCr 구하기] nPr/r! 공식 활용 ver.')
numN = int(input('N 입력: '))
numR = int(input('R 입력: '))
resultP = 1
resultR = 1
resultC = 1
for n in range(numN, (numN-numR), -1): #range의 최대를 numN-numR으로 설정해야, numN-numR+1까지 계산 가능
resultP *= n
print(f'n: {n}')
print(f'{numN}P{numR} result: {int(resultP)}')
for r in range(numR, 0, -1):
print(f'r: {r}')
resultR *= r
resultC = int(resultP / resultR)
print(f'{numN}C{numR} result: {resultC}')
[nCr 구하기] nPr/r! 공식 활용 ver.
N 입력: 8
R 입력: 3
n: 8
n: 7
n: 6
8P3 result: 336
r: 3
r: 2
r: 1
8C3 result: 56
(위 코드에 아래 코드 추가)
result = 1/resultC*100
print(f'{numN}장 중 {numR}장 뽑을 때 3,4,5 조합일 경우의 수: {round(result, 2)}%')
<Output>
5장 중 3장 뽑을 때 3,4,5 조합일 경우의 수: 10.0%

def calP(numN, numR):
resultP = 1
for n in range(numN, (numN - numR), -1):
resultP *= n
print(f'{numN}P{numR} result: {resultP}')
return resultP
def calC(numN, numR):
resultR = 1
resultC = 1
#nPr 순열 구하기: resultR
resultP = calP(numN, numR)
for r in range(numR, 0, -1):
resultR *= r
#nCr 조합 구하기: resultC
resultC = int(resultP / resultR)
print(f'{numN}C{numR} result: {resultC}')
return resultC
pb = calC(4,2)*calC(3,1)/calC(7,3)*100
print(f'prob: {round(pb,2)}%')
<Output>
4P2 result: 12
4C2 result: 6
3P1 result: 3
3C1 result: 3
7P3 result: 210
7C3 result: 35
prob: 51.43%