제로베이스 데이터 취업 파트타임/100일 챌린지_일일 학습 일지
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.18]
김뚱입니다
2025. 4. 18. 07:53
[강의 요약]
[Part 02. 수학_Ch 01. 기초 수학] 강의 수강
42_[연습문제] 군 수열부터 45_[연습문제] 확률까지 강의 수강하였음
🐢 100일 챌린지 🔥 : [▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰░ ] 33/100일 (33%)
[연습문제_군 수열]
군수열은 수열을 '특정 규칙에 따라 묶음(군)'으로 나누어 나열한 수열이다.
▶ 코드
flag = True
n = 1
nCnt = 1; searchNC = 0; searchNP = 0
sumN = 0
while flag:
for i in range(1, (n + 1)):
if i == n:
print('{}/{} '.format(i, (n - i + 1)), end='')
else:
print('{}/{}, '.format(i, (n - i + 1)), end='')
sumN += i / (n - i + 1)
nCnt += 1
if (sumN > 100):
searchNC = i
searchNP = n - i + 1
flag = False
break
print()
n += 1
print('수열의 합이 최초 100을 초과하는 항, 값, 합: {}항, {}/{}, {}'.format(nCnt, searchNC, searchNP, sumN))
- 군수열은 항들을 군 단위로 묶어 구조화된 수열
- 각 n번째 군은 n개의 항으로 구성됨
- 각 항의 형태는 i / (n - i + 1)
- 수열을 누적하면서 합이 100을 초과하는 지점을 탐색
- 합이 특정 값을 넘는 조건을 만족하는 항을 반복문과 조건문으로 탐색
★ 출력 결과 ★
1/1
1/2, 2/1
1/3, 2/2, 3/1
...
수열의 합이 최초 100을 초과하는 항, 값, 합: 142항, 11/1, 100.509...
[연습문제_순열]
순열은 n개의 항목 중 r개를 순서 있게 나열하는 경우의 수
▶ 코드 1
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
result = 1
for n in range(numN, numN - numR, -1):
print('n : {}'.format(n))
result *= n
print('result: {}'.format(result))
★ 출력 결과 ★
numN 입력: 9
numR 입력: 4
n : 9
n : 8
n : 7
n : 6
result: 3024
▶ 코드 2
fNum1 = int(input('factorial1: '))
result1 = 1
for n in range(fNum1, 0, -1):
result1 *= n
print('result1: {}'.format(result1))
fNum2 = int(input('factorial2: '))
result2 = 1
for n in range(fNum2, 0, -1):
result2 *= n
print('result2: {}'.format(result2))
print('모든 경우의 수: {}'.format(result1 * result2))
★ 출력 결과 ★
factorial1: 4
result1: 24
factorial2: 3
result2: 6
모든 경우의 수: 144
▶ 코드 3
코드 2를 math.factorial()을 이용해서 푼 코드
import math
result1 = math.factorial(fNum1)
result2 = math.factorial(fNum2)
print('모든 경우의 수: {}'.format(result1 * result2))
★ 출력 결과 ★
모든 경우의 수: 144
[연습문제_조합]
조합은 n개 중에서 순서 없이 r개를 선택하는 경우의 수
▶ 코드
import math
# 첫 번째 조합: 9C4
n1 = 9
r1 = 4
result1 = math.comb(n1, r1)
print(f'{n1}C{r1} = {result1}')
# 두 번째 조합: 6C2
n2 = 6
r2 = 2
result2 = math.comb(n2, r2)
print(f'{n2}C{r2} = {result2}')
★ 출력 결과 ★
9C4 = 126
6C2 = 15
▶ 코드
- 전체 카드 : {1, 2, 3, 4, 5, 6, 7}
- 총 조합 수 = 7C3 = 35
- 3, 4, 5가 동시에 선택될 수 있는 경우는 단 1가지임
import math
total_cases = math.comb(7, 3) # 전체 조합 수
success_cases = 1 # 3,4,5 동시에 선택되는 경우
probability = success_cases / total_cases * 100
print(f'확률: {round(probability, 2)}%')
★ 출력 결과 ★
확률: 2.86%
[연습문제_확률]
확률은 특정 사건이 일어날 수 있는 수를 찾는 것
▶ 코드
def proFun():
numN = int(input('numN 입력: ')) # 전체 수
numR = int(input('numR 입력: ')) # 선택할 수
resultP = 1
resultR = 1
for n in range(numN, numN - numR, -1):
resultP *= n
print('resultP: {}'.format(resultP))
for n in range(numR, 0, -1):
resultR *= n
print('resultR: {}'.format(resultR))
resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))
return resultC
# 전체 경우의 수: 10장에서 6장 뽑기
sample = proFun()
print('sample: {}'.format(sample))
# 사건1: 꽝 6장에서 3장 뽑기
event1 = proFun()
print('event1: {}'.format(event1))
# 사건2: 선물 4장에서 3장 뽑기
event2 = proFun()
print('event2: {}'.format(event2))
# 확률 계산
probability = (event1 * event2) / sample
print('probability: {}%'.format(round(probability * 100, 2)))
- 전체 경우의 수 = 10C6 = 210
- 사건 1 = 6C3 = 20
- 사건 2 = 4C3 = 4
- 성공 경우의 수 = 20 × 4 = 80
- 확률 = (80 / 210) × 100 ≈ 38.1%
★ 출력 결과 ★
numN 입력: 10
numR 입력: 6
resultP: 151200
resultR: 720
resultC: 210
sample: 210
numN 입력: 6
numR 입력: 3
resultP: 120
resultR: 6
resultC: 20
event1: 20
numN 입력: 4
numR 입력: 3
resultP: 24
resultR: 6
resultC: 4
event2: 4
probability: 38.1%
[나의 생각 정리]
알고 있던 이론적인 내용(공식)을 파이썬 코드로 구현하면서 복습할 수 있었다.
그리고 수식으로 수학 계산하는 것보다 코드로 구현하려니까 훨씬 어렵다.
코테에서 이런 문제를 많이 물어볼 텐데 아직 바로바로 작성할 자신이 없음 ㅠ
[적용점]
코딩테스트 문제에서 자주 보이는 유형들
“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”