코딩하는 타코야끼

[스터디 노트] Week3_2일차 [unit31 ~ 45] - 기초수학 문제풀이 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week3_2일차 [unit31 ~ 45] - 기초수학 문제풀이

가스오부시 2023. 7. 19. 06:58
728x90
반응형

1. 기초수학 문제풀이_1 [unit 31 ~ 35]


📍 [연습문제] 약수와 소수

  • 100부터 1000사이의 난수에 대해서 약수, 소수, 그리고 소인수를 출력하는 프로그램을 만들어보자.
import random 

num_r = random.randint(100, 1000)

num_y = [] # 약수
num_s = [] # 소수
num_sy = [] # 소인수

for i in range(1, (num_r + 1)):
    soinsu = 0
    
    # 약수
    if num_r % i == 0:
        num_y.append(i)
        soinsu += 1
        
    # 소수
    if i != 1:
        is_prime = True

        for num in range(2, int(i ** 0.5) + 1):
            if i % num == 0:
                is_prime = False
                break
        if is_prime:
            num_s.append(i)
            soinsu += 1
            
    # 소인수
    if soinsu >= 2:
        num_sy.append(i)
        
print(f"난수: {num_r}")
print(f"약수: {num_y}")
print(f"소수: {num_s}")
print(f"소인수: {num_sy}")
>>>
난수: 339
약수: [1, 3, 113, 339]
소수: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,.....331, 337]
소인수: [3, 113

📍 [연습문제] 소인수와 소인수분해

  • 100부터 1000사이의 난수를 소인수분해를 하고 각각의 소인수에 대한 지수를 출력하는 프로그램을 만들어보자.
import random

num_r = random.randint(100, 1000)
print(f"난수: {num_r}")

soin_list = []

n = 2
while 2 <= num_r:
    if num_r % n == 0:
        soin_list.append(n)
        num_r /= n
    else:
        n += 1
        
print(f"소인수: {soin_list}")

temp_num = 0
for s in soin_list:
    if temp_num != s:
        print(f"[{s}] 의 갯수: {soin_list.count(s)}")
        temp_num = s
>>>
난수: 270
소인수: [2, 3, 3, 3, 5]
[2] 의 갯수: 1
[3] 의 갯수: 3
[5] 의 갯수: 1

📍 [연습문제] 최소공배수

  • 100부터 1000사이의 2개의 난수에 대해서 최대공약수와 최소공배수를 출력하는 프로그램을 만들어보자.
import random

num_r1 = random.randint(100, 1000)
num_r2 = random.randint(100, 1000)

print(f"난수1: {num_r1}")
print(f"난수2: {num_r2}")
max_num = 0

for i in range(1, min(num_r1, num_r2) + 1):
    
    if num_r1 % i == 0 and num_r2 % i == 0:
        max_num = i
        
min_num = (num_r1 * num_r2) // max_num

print(f"두 난수에 대한 최대공약수: {max_num}")
print(f"두 난수에 대한 최소공약수: {min_num}")
>>>
난수1: 756
난수2: 174
두 난수에 대한 최대공약수: 6
두 난수에 대한 최소공약수: 21924

📍 [연습문제] 진법

  • 사용자가 입력한 수를 이용해서, 다음 내용에 따라 진법 변환하는 코드를 작성해보자.
num = int(input("숫자 입력: "))

num_bin = bin(num)
num_oct = oct(num)
num_hex = hex(num)

print(f"정수 -> 2진수: {num_bin}")
print(f"정수 -> 8진수: {num_oct}")
print(f"정수 -> 16진수: {num_hex}")

print("2진수(0b1010) -> 10진수({})".format(int(0b1010)))
print("8진수(0o12) -> 10진수({})".format(int(0o12)))
print("16진수(0xa) -> 10진수({})".format(int(0xa)))
>>>
숫자 입력: 10
정수 -> 2진수: 0b1010
정수 -> 8진수: 0o12
정수 -> 16진수: 0xa
2진수(0b1010) -> 10진수(10)
8진수(0o12) -> 10진수(10)
16진수(0xa) -> 10진수(10)

2. 기초수학 문제풀이_2 ~ 3 [unit 36 ~ 45]


📍 [연습문제] 등차수열

  • 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
  • {4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 64... }
a1 = int(input("a1: "))
d = int(input("공차(d): "))
n = int(input("n번째 항: "))

result_basic = a1 + (n-1) * d
result_final = int(n * (a1 + result_basic) / 2)

print(f"n번째 항 값: {result_basic}")
print(f"n번째 까지 합: {result_final}")
>>>
a1: 4
공차(d): 6
n번째 항: 3
n번째 항 값: 16
n번째 까지 합: 30

📍 [연습문제] 등비수열

  • 다음 수열의 일반항을 구하고 n번째항의 값과 합을 구하는 프로그램을 만들어보자.
  • {2, 6, 18, 54, 162, 486, 1458, 4374, 13122, ... }
a1 = int(input("a1: "))
r = int(input("공비(r): "))
n = int(input("n번째 항: "))

result_basic = a1 * r**(n - 1)
result_final = int(a1 * (1 - (r**n) / (1 - r)))

print(f"n번째 항 값: {result_basic}")
print(f"n번째 까지 합: {result_final}")
>>>
a1: 2
공비(r): 3
n번째 항: 4
n번째 항 값: 54
n번째 까지 합: 83

📍 [연습문제] 피보나치수열

  • 피보나치수열에서 n항의 값과 n항까지의 합을 출력하는 프로그램을 만들어보자.
  • {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...}
def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        a, b = 0, 1
        for _ in range(n-1):
            a, b = b, a + b
        return b
    
    
num = int(input("숫자 입력: "))

fibo_l = []
for i in range(1, (num + 1)):
    fibo_l.append(fibonacci(i))
    
print(f"n항의 값: {fibo_l[num-1]}")
print(f"n항 까지의 합: {sum(fibo_l[:num])}")
>>>
숫자 입력: 4
n항의 값: 3
n항 까지의 합: 7

📍 [연습문제] 팩토리얼

  • 팩토리얼 프로그램을 만들되, 반복문을 이용한 함수와 재귀 함수를 이용해서
  • 구현해보고 또한, 파이썬에서 제공하는 모듈도 사용해 보자.
def fac_fun1(n):
    
    fac = 1
    for i in range(1, (n+1)):
        fac *= i
    
    return fac

def fac_fun2(n):
    
    if n == 1:
        return n
    
    return n * fac_fun2(n-1)

num = int(input("사용자 숫자 입력: "))
print(f"반복문을 이용한 {num}! 팩토리얼: {fac_fun1(num)}")
print(f"재귀함수를 이용한 {num}! 팩토리얼: {fac_fun2(num)}")
>>>
사용자 숫자 입력: 6
반복문을 이용한 6! 팩토리얼: 720
재귀함수를 이용한 6! 팩토리얼: 720

📍 [연습문제] 순열

  • 파이썬을 이용해서 다음 순열들의 값을 구하는 프로그램을 만들어 보자.

num1 = int(input("숫자1 입력: "))
num2 = int(input("숫자2 입력: "))

result = 1
for i in range(num1, (num1- num2), -1):
    result *= i
    
print(f"{result = }")
>>>
숫자1 입력: 7
숫자2 입력: 3
result = 210

📍 [연습문제] 조합

  • 파이썬을 이용해서 다음 조합들의 값을 구하는 프로그램을 만들어 보자.

num_n = int(input("숫자1 입력: "))
num_r = int(input("숫자2 입력: "))

result_p = 1 # 순열
result_r = 1
result_c = 1 # 조합

for i in range(num_n, num_n - num_r, -1):
    result_p *= i
print(f"{result_p = }")

for i in range(num_r, 0, -1):
    result_r *= i
print(f"{result_r = }")

result_c = int(result_p / result_r)

print(f"{result_c = }")
>>>
숫자1 입력: 6
숫자2 입력: 2
result_p = 30
result_r = 2
result_c = 15

📍 [연습문제] 확률

  • 박스에 ‘꽝’이 적힌 종이가 6장 있고, ‘선물’이 적힌 종이가 4장이 있을 때,
  • 파이썬을 이용해서 ‘꽝’3장과 ‘선물’ 3장을 뽑는 확률(%)을 출력하자.

# 전체 경우의 수: 10C6
# 꽝: 6C3
# 선물: 4C3
# 전체의 경우의 수는: 꽝 * 선물 / 전체 경우의 수

def percent():
    num_n = int(input("num_n 입력: "))
    num_r = int(input("num_r 입력: "))

    result_p = 1 # 순열
    result_r = 1
    result_c = 1 # 조합

    for i in range(num_n, (num_n - num_r), -1):
        result_p *= i
    print(f"{result_p = }")

    for i in range(num_r , 0, -1):
        result_r *= i
    print(f"{result_r = }")

    result_c = int(result_p / result_r)
    print(f"{result_c = }")
    
    return result_c

# 전체 경우의 수
print("="*9, "전체 경우의 수", "="*9)
total = percent()
print("="*30)
# 꽝
print("="*13, "꽝", "="*13)
kk = percent()
print("="*30)
# 선물
print("="*13, "선물", "="*12)
gift = percent()
print("="*30)

result = (kk * gift) / total
print(f"percentage: {round(result * 100, 2)}")
>>>
========= 전체 경우의 수 =========
num_n 입력: 10
num_r 입력: 6
result_p = 151200
result_r = 720
result_c = 210
==============================
============= 꽝 =============
num_n 입력: 6
num_r 입력: 3
result_p = 120
result_r = 6
result_c = 20
==============================
============= 선물 ============
num_n 입력: 4
num_r 입력: 3
result_p = 24
result_r = 6
result_c = 4
==============================
percentage: 38.1
반응형