본문 바로가기
제로베이스 데이터 스쿨/일일 스터디 노트

10일차 스터디노트 / 기초수학 약수와 소수, 최소공배수와 최소공약수, 진법, 등차수열 + 파이썬 / 제로베이스 데이터 취업스쿨

by 김뎀뎀 2023. 1. 14.

📗 10일차 공부 내용 요약

[ 기초수학과 파이썬 ]

1. 약수와 소수 : 약수와 소수의 개념을 알아보고, 파이썬으로 구현해보았다

2. 최대공약수와 최소공배수 : 공약수, 최대공약수, 공배수, 최소공배수의 개념을 알아보고, 파이썬으로 구현해보았다.

3. 진법 : 2,8,10,16진법의 개녑을 알아보고, 파이썬으로 구현해보았다.

4.수열과 등차수열 : 수열과 등차수열의 개념,공식을 알아보고 파이썬으로 구현해보았다.

 


📖  10일차 공부 내용 자세히

1. 약수와 소수

■ 약수

  • 어떤 수를 나누어 떨어지게 하는 수
  • 모든 정수는 1과 자기 자신을 약수로 가진다
  • EX) 2의 약수 [ 1,2 ] 9의 약수 [ 1, 3, 9 ] 22의 약수 [ 1, 2, 11, 22 ]

 

■ 소수

  • 1과 자기 자신만을 약수로 가지는 수
  • 단, 1은 제외 한다
  • EX) 2, 3, 5, 7, 11, 13, 17, 19

 

■ 합성수

  • 1보다 큰 자연수 중에서 소수가 아닌 수
  • 합성수는 3개 이상의 약수를 갖는다
  • 1은 소수도 아니고 합성수도 아니다

 

■ 소인수분해

  • 1보다 큰 정수를 소인수의 곱으로 나타낸 것을 소인수분해라고 한다
  • 소인수 = 소수이면서 약수인 수
    • ex. 12의 소인수 [ 2,3] 25의 소인수 [ 5 ] 36의 소인수 [ 2, 3 ]

 

약수 구하기
inputNum = int(input('정수 입력 : '))

for number in range(1,inputNum+1):
    if inputNum % number == 0:
        print(f'{inputNum}의 약수 : {number}')
소수 구하기
inputNum = int(input('정수 입력 : '))

for number in range(1,inputNum+1):
    if inputNum % number == 0:
        print(f'{inputNum}의 약수 : {number}')
소인수 분해 하기
inputNum = int(input('1보다 큰 정수: '))

n = 2
while n <= inputNum:
    if inputNum % n == 0: #n으로 나눠준다
        print(f'소인수 : {n}')
        inputNum /= n #n로 나눈 값을 다시 인풋넘버로 올려서 반복한다
    else:
        n += 1

 

2. 최대공약수와 최소공배수

■ 공약수

  • 2개 이상의 수 에서 공통된 약수
  • ex) 30과 60의 공약수 [ 1, 2, 3, 4, 6, 12 ]

 

■ 최대 공약수

  • 공약수 중에서 가장 큰 수
  • 소인수 분해를 이용하면 최대공약수 및 공약수를 구할 수 있다
    • 최대공약수 = 공통인 소인수의 거듭제곱에서 지수가 작은 수를 모두 곱한다
    • ex) 12 = 2² *x3 , 20 = 2² x 5 ⇒ 최대공약수 2² = 4
  • 최대 공약수의 약수는 공약 수 이다
    • ex) 18과 24의 최대 공약수 : 6 , 공약수 : 1, 2, 3, 6

 

■ 공배수

  • 2개 이상의 수 에서 공통된 배수
  • ex) 3과 5의 공배수 [ 115, 30, 45 … ]

 

■ 최소공배수

  • 공약수 중에서 가장 작은 수
  • 소인수 분해를 이용하면 최소공배수 및 공배수를 구할 수 있다
    • 최소공배수 = 공통인 소인수의 거듭제곱에서 지수가 크고 공통아닌 수를 모두 곱한다
    • ex) 12 = 2² *x3 , 4 = 2² ⇒ 최대공약수 2² x 3= 12
  • 최대 배수의 베수는 공배수 이다
    • ex) 4과 6의 최대 공배수 : 12 , 공약수 : 12, 24, 36, …
  • 최소 공배수 = 두 정수의 곲 // 최대공약수 
    • 두 정수의 곲 = 최소공배수 * 최대공배수

 

최대 공약수 구하기
#num1이 작은 수
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))

maxNum = 0

for n in range(1,num1+1):
    if num1 % n == 0 and num2 % n== 0:
        print(f'{num1}과 {num2}의 공약수 : {n}')
        maxNum = n

print(f'{num1}과 {num2}의 최대공약수 : {maxNum}')

 

최소공배수 구하기
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))

maxNum = 0

for n in range(1,num1+1):
    if num1 % n == 0 and num2 % n== 0:
        print(f'공약수 : {n}')
        maxNum = n

print(f'최대공약수 : {maxNum}')

minNum = (num1 * num2) // maxNum
print(f'최소공배수 : {minNum}')

 

3. 진법

■ 진법이란 특정 숫자 몇개를 사용하여 수를 표시하는 방법

  • 2진법 : 0 ~1 / 2개사용
  • 8진법 : 0~7 / 8개사용
  • 10진법: 0~9 / 10개사용
  • 16진법:0~16 /16개사용

 

특정 진수로 바꾸기
dNum =30

#10진수 => 2진수 / 변환 결과는 문자열!

    #함수 활용
print('2진수: {}'.format(bin(dNum)))
print('8진수: {}'.format(oct(dNum)))
print('16진수:{}'.format(hex(dNum)))

    #format()함수
print('2진수: {}'.format(format(dNum, '#b'))) 
print('8진수: {}'.format(format(dNum, '#o')))
print('16진수:{}'.format(format(dNum, '#x')))

#x진수 => 10진수

print('2진수(0b11110) -> 10진수({})'.format(int('0b11110',2)))
print('8진수(0o36) -> 10진수({})'.format(int('0o36',8)))
print('16진수(0x1e) -> 10진수({})'.format(int('0x1e',16)))

#x진수 => x진수
print('2진수(0b11110) -> 8진수({})'.format(oct(0b11110)))
print('2진수(0b11110) -> 10진수({})'.format(int(0b11110)))
print('2진수(0b11110) -> 16진수({})'.format(hex(0b11110)))

print('8진수(0o36) -> 2진수({})'.format(bin(0o36)))
print('8진수(0o36) -> 10진수({})'.format(int(0o36)))
print('8진수(0o36) -> 16진수({})'.format(hex(0o36)))

print('16진수(0x1e) -> 2진수({})'.format(bin(0x1e)))
print('16진수(0x1e) -> 8진수({})'.format(oct(0x1e)))
print('16진수(0x1e) -> 10진수({})'.format(int(0x1e)))

 

 

4.수열과 등차수열

■ 수열

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

 

■ 등차수열

  • 연속된 두 항의 차이가 일정한 수열
  • 두 항의 차이를 공차(d)라고 한다
  • 일반항 : an = a1 + (n-1)d
  • 등차중앙 (연속된 세 항에서 가운데 항) : 양 두항의 합 /2
  • 등차수열의 합 :: sn = n(a1 + an) /2

 

등차수열 n번째 항의 값 구하기
#반복문으로 구하기

inputN1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input('n 입력:'))

valueN = 0

n = 1
while n <= inputN :

    if n == 1 :
        valueN= inputN1
        print('{}번째 항의 값 : {}'.format(n, valueN))
        n += 1
        continue

    valueN += inputD
    print('{}번째 항의 값 : {}'.format(n, valueN))

    n += 1

print('{}번째 항의 값 : {}'.format(inputN, valueN))


#공식으로 구하기
inputN1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input('n 입력:'))

valueN = inputN1 + (inputN -1)*inputD

print('{}번째 항의 값 : {}'.format(inputN, valueN))

 

등차수열 n번째 항까지의 합 구하기
#반복문으로 구하기
inputN1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input('n 입력:'))

valueN = 0
sum = 0

n = 1
while n <= inputN :

    if n == 1 :
        valueN= inputN1
        sum += valueN
        print('{}번째 항까지의 합 : {}'.format(n, sum))
        n += 1
        continue

    valueN += inputD
    sum += valueN
    print('{}번째 항까지의 합 : {}'.format(n, sum))

    n += 1

print('{}번째 항까지의 합 : {}'.format(inputN, sum))

#공식으로 구하기
inputN1 = int(input('a1 입력 : '))
inputD = int(input('공차 입력 : '))
inputN = int(input('n 입력:'))


valueN = inputN1 + (inputN -1) * inputD
sum = inputN * (inputN1 + valueN) / 2

print('{}번째 항까지의 합 : {}'.format(inputN, int(sum)))

➰ 10일차 후기

중학생 때 배웠던 개념들을 다시 배우니, 기억이 나면서도 또 뚜렷하게 생각나진 않으니 다시 외워야 하는 게 생긴 기분이다.

그래도 이해하는 데 오래 걸리진 않으니 다행이다만 파이썬으로 구현하는 건 또 다른 문제인 듯 하다.

이전 예제들에서 공약수와 공배수 를 활용하는 것들이 많았는데 이번 공부로 명확하게 잡힌 것 같아 좋다.

그만큼 자주 활용될 듯 하니 잘 짚어두자~


※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.