Day21. 기초 수학 (1~2)

Junghwan Park·2023년 5월 7일
0

스터디노트

목록 보기
22/54

약수와 소수

  • 약수
    어떤 수를 나누어 떨어지게 하는 수!

2
2 / 1 = 2
2 / 2 = 1
1과 2는 2의 약수


3
3 / 1 = 3
3 / 2 = 1 .. 1
3 / 3 = 1
2는 3을 나누어 나머지가 생기므로 약수에서 제외!


8
8 / 1 = 8
8 / 2 = 4
8 / 4 = 2
8 / 8 = 1
1, 2, 4. 8은 8의 약수


22
22 / 1 = 22
22 / 2 = 11
22 / 11 = 2
22 / 22 = 1
1, 2, 11, 22는 22의 약수


  • 소수
    1과 그 수 자신만을 약수로 가지는 수!
    (단, 1은 제외)

2
2 / 1 = 2
2 / 2 = 1
1과 본인 자신인 2만 약수로 가지므로 2는 소수


3
3 / 1 = 3
3 / 2 = 1 .. 1
3 / 3 = 1
1과 자신인 3만 약수로 가지므로 3은 소수


4 / 1 = 4
4 / 2 = 2
4 / 3 = 1 .. 1
4 / 4 = 1
1, 2, 4를 약수로 가지므로 4는 소수가 아니다


5
5 / 1 = 5
5 / 5 = 1
1과 자신인 5만 약수로 가지므로 5는 소수


  • 실습1
    1부터 30까지의 숫자 중 5로 나눈 몫과 나머지가 모두 소수인 숫자들을 찾아보자.

5로 나누어 몫이 될 수 있는 소수 = 2, 3, 5 (4는 소수가 아니므로 제외)
5를 곱해준다
10, 15, 25 여기에 5보다 작은소수 2, 3를 더해준다
12, 13, 17, 18, 27, 28

-실습2
1부터 30까지의 숫자 중 소수를 찾아보자.

1제외,
2는 소수 2의 배수는 약수가 3개 이상이 되므로 2의 배수를 모두 지워준다
3은 소수 3의 배수는 약수가 3개 이상이 되므로 3의 배수를 모두 지워준다
5는 소수 5의 배수는 약수가 3개 이상이 되므로 5의 배수를 모두 지워준다
같은 방식으로 반복!


약수와 소수(파이썬)

-파이썬을 이용해서 사용자가 입력한 숫자의 약수를 출력해보자.

inputNumber = int(input("0보다 큰 정수 입력 : "))
inpuNumPrint = []

for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:    # 사용자가 입력한 숫자를 나누어 0이 되는 것을 찾는다
        inpuNumPrint.append(number)
        print('{}의 약수 : {}'.format(inputNumber, number))

print('{}의 약수 : {}개'.format(inputNumber, len(inpuNumPrint)))
  • 파이썬을 이용해서 사용자가 입력한 숫자까지의 소수를 출력해보자.
inputNumber = int(input('0보다 큰 정수 입력 : '))

for number in range(2, (inputNumber + 1)):  # 1은 소수가 아니므로 2부터 사용자가 입력한 숫자까지
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False    # 나머지가 0이면 약수가 있으므로 소수가 아님 ex) 4의 경우 2가 여기서 break
            break

    if (flag):
        print('{} : 소수!!'.format(number))
    else:
        print('{} : \t\t합성수!!'.format(number))

소수 부분은 한번 더 해보기


소인수와 소인수분해

  • 소인수
    약수(인수) 중에서 소수인 숫자를 소인수라고 한다.

20의 약수(인수) → 1 2 4 5 10 20
→ 2, 5가 여기서 소인수


12의 소인수? (1, 2, 3, 4, 6, 12) → (2, 3)
25의 소인수? (1, 2, 3, 4, 9, 12, 18, 36) → (2, 3)
36의 소인수? (1, 5, 20) → (5)
41의 소인수? (1, 41) → (41)

  • 소인수분해
    1보다 큰 정수를 소인수의 곱으로 나타낸 것을 소인수분해라고 한다.
    소인수분해를 통해 약수를 정확하고 쉽게 구할 수 있다.

20의 소인수분해 → 2 10 → 2 2 5
어떤수의 소인수의 곱으로만 나타낸 것을 소인수분해!


12의 소인수분해? (2^2
3)
36의 소인수분해? (2^2 * 3^2)
25의 소인수분해? (5^5)
41의 소인수분해? (41)

소인수와 소인수분해(파이썬)

  • 파이썬을 이용해서 사용자가 입력한 수를 소인수분해하자.
inputNumber = int(input('1보다 큰 정수 입력: '))

n = 2
while n <= inputNumber:
    if inputNumber % n == 0:    # 소인수
        print('소인수 : {}'.format(n))
        inputNumber /= n    # 12를 2로 나눈경우 2, 6이다 inputnumber에 6을 할당하여 또 소수로 나누어 준다!
    else:
        n += 1
  • 72에 x를 곱하면 y의 제곱이 된다고 할 때, x에 해당하는 가장 작은 정수를 구하자.


    2 2 2 3 3 = ?^2
    => 2^3 3^2 = ?^2
    => 2^2
    2 * 3^2 = ?^2 # 홀수인 녀석을 거듭제곱으로 해주면 된다
inputNumber = int(input('1보다 큰 정수 입력: '))

n = 2
searchNumbers = []

while n <= inputNumber:
    if inputNumber % n == 0:    # 소인수
        print('소인수 : {}'.format(n))
        if searchNumbers.count(n) == 0:   # searchNumbers에 n없으면 추가 있으면 지워주는 방식으로!
            searchNumbers.append(n)
        elif searchNumbers.count(n) == 1:
            searchNumbers.remove(n)
        inputNumber /= n    # 12를 2로 나눈경우 2, 6이다 inputnumber에 6을 할당하여 또 소수로 나누어 준다!
    else:
        n += 1

print('searchNumbers : {}'.format(searchNumbers))

최대공약수

  • 공약수
    두 개 이상의 수에서 공통된 약수를 공약수라고 한다.

12의 약수 → 1, 2, 3, 4, 6, 12
20의 약수 → 1, 2, 4, 5, 10, 20
공약수 → 1, 2, 4


36, 60의 공약수?
36의 약수 → (1, 2, 3, 4, 6, 7, 12, 18, 36)
60의 약수 → (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60)
공약수 → (1, 2, 3, 4, 6, 12)


12, 52, 82의 공약수?
12의 약수 → (1, 2, 3, 4, 6, 12)
52의 약수 → (1, 2, 4, 13, 26, 52)
82의 약수 → (1, 2, 41, 81)
공약수 → (1, 2)

  • 최대 공약수
    공약수 중 가장 큰 수를 최대공약수라고 한다.

12의 약수 → 1, 2, 3, 4, 6, 12
20의 약수 → 1, 2, 4, 5, 10, 20
공약수 → 1, 2, 4
최대공약수 → 4


소인수분해를 이용하면 최대공약수 및 공약수를 구할 수 있다.


최대공약수의 약수가 공약수가 된다.


좀 더 편리하게 최대공약수 구하는 방법! 소수로 나눗셈 하자!


12와 20의 최대공약수
2 [12, 20]
2 [ 6, 10]
3 5


왼쪽의 2가 최대공약수 2 * 2 = 4
공약수는 4의 약수 1, 2, 4

싷습1
12, 54, 72의 최대공약수 및 공약수? (6), (1, 2, 3, 6)
25, 115, 255의 최대공약수 및 공약수? (5), (1, 5)

실습2
빵 112개와 우유 80개를 학생들한테 남김없이 동일하게 나누어 주려고 할 때,
최대 몇 명의 학생이 빵과 우유를 받을 수 있는지 계산해 보자.
그리고, 학생 한 명이 받게 되는 빵과 우유의 개수를 계산해 보자.


최대공약수(파이썬)

  • 두 개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성하자.
    (두번째 입력되는 수가 더 크다고 가정한다)
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
maxNum = 0

for i in range(1, (num1 + 1)):
    if num1 % i == 0 and num2 % i ==0:    # 공약수
        print('공약수 : {}'.format(i))
        maxNum = i  # 가장 마지막 i가 maxNum에 들어가므로 최대공약수

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

  • 세 개의 수를 입력하면 공약수와 최대공약수를 출력하는 코드를 작성하자.
두 개의 수로 할 때와 다른점 없다

num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
num3 = int(input('1보다 큰 정수 입력 : '))
maxNum = 0

for i in range(1, (num1 + 1)):
    if num1 % i == 0 and num2 % i == 0 and num3 % i == 0:    # 공약수
        print('공약수 : {}'.format(i))
        maxNum = i  # 가장 마지막 i가 maxNum에 들어가므로 최대공약수

print('최대공약수 : {}'.format(maxNum))
  • 유클리드 호제법


    유클리드 호제법을 이용해서 최대공약수를 구할 수 있다.
    x, y의 최대공약수는 y, r(x%y)의 최대공약수와 같다. r은 x를 y로 나눈 나머지
    나머지가 0이 될 때까지

[유클리드 호제법을 이용한 최대공약수 코딩]

num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))

temp1 = num1
temp2 = num2

while temp2 > 0:
    temp = temp2
    temp2 = temp1 % temp2
    temp1 = temp

print('{}, {}의 최대공약수 : {}'.format(num1, num2, temp1))

최소공배수

  • 공배수
    두 개 이상의 수에서 공통된 배수를 공배수라고 한다.
3의 배수 → 3 6 9 12 15 18 21 24 27 30 ...
5의 배수 → 5 10 15 20 25 30 35 40 45 50 ...
공배수 → 15, 30 ...

3, 4의 공배수?
3의 배수 → 3 6 9 12 15 18 21 24 27 30 ...
4의 배수 → 4 8 12 16 20 24 28 32 ...
공부새 → 12, 24 ...

2, 3, 4의 공배수?
3의 배수 → 3 6 9 12 15 18 21 24 27 30 ...
3의 배수 → 5 10 15 20 25 30 35 40 45 50 ...
4의 배수 → 5 10 15 20 25 30 35 40 45 50 ...
공배수 → 15, 30 ...

  • 최소공배수
    공배수 중 가장 작은 수를 최소공배수라고 한다.

3의 배수 → 3 6 9 12 15 18 21 24 27 30 ...
5의 배수 → 5 10 15 20 25 30 35 40 45 50 ...
공배수 → 15, 30 ...
최소공배수 → 15


소인수분해를 이용하면 최소공배수 및 공배수를 구할 수 있다.
공통인 소인수의 거듭제곱에서 지수가 크고 공통아닌 수를 모두 곱한다.


4의 소인수분해 2^2
12의 소인수분해 2^2 3


공배수 : 12의 배수(12, 24, 36, ...)


6, 12, 15의 최소공배수?
6의 소인수분해 2
3
12의 소인수분해 2^2 3
15의 소인수분해 3
5


2^2 3 5
공배수 : 60


5, 7의 최소공배수?
두 수 모두 소수이므로 바로 곱해준다
35


좀 더 편리하게 최소공배수 구하는 방법! 소수로 나눗셈 하자!


6과 12 그리고 15의 최소공배수
2 [6 12 15]
3 [3 6 15]
1 2 5


2 3 1 2 5 = 60
최소공배수 : 60

  • 실습1
    다음 수의 최소공배수 및 공배수를 구해보자.
    12, 21, 33의 최소공배수 및 공배수?
  • 실습2
    2, 5, 8 중 하나만 제외하고 나머지 두 개의 수는 5를 곱하여도 최소공배수에 변함이 없다.
    5를 곱하였을 때 최소공배수에 변함이 있는 수를 찾아보자.


    2, 5, 8의 최소공배수 → 40
    10, 5, 8의 최소공배수 → 40
    2, 25, 8의 최소공배수 → 200
    2, 5, 40의 최소공배수 → 40

최소공배수(파이썬)

  • 두 개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자.
num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
maxNum = 0

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

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

minNum = (num1 * num2) // maxNum    # 입력받은 수의 곱을 입력받은 수의 최대공약수로 나누어주면 최소공배수이다!

print('최소공배수 : {}'.format(minNum))
  • 세 개의 수를 입력하면 최소공배수를 출력하는 코드를 작성하자.
두 개의 수에 대한 최소공배수를 구한 후 다시 세 번째 수의 공배수를 구한다.

num1 = int(input('1보다 큰 정수 입력 : '))
num2 = int(input('1보다 큰 정수 입력 : '))
num3 = int(input('1보다 큰 정수 입력 : '))
maxNum = 0

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

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

minNum = (num1 * num2) // maxNum    # 입력받은 수의 곱을 입력받은 수의 최대공약수로 나누어주면 최소공배수이다!
print('{}, {}의 최소공배수 : {}'.format(num1, num2, minNum))

newNum = minNum
for i in range(1, (newNum + 1)):
    if newNum % i == 0 and num3 % i == 0:
        maxNum = i

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

minNum = (newNum * num3) // maxNum

print('{}, {}, {}의 최소공배수 : {}'.format(num1, num2, num3, minNum))

-섬마을에 과일, 생선, 야채를 판매하는 배가 다음 주기로 입항한다고 할 때,
모든 배가 입항하는 날짜를 계산해 보자.


과일 선박 : 3일 주기
생선 선박 : 4일 주기
야채 선박 : 5일 주기

ship1 = 3
ship2 = 4
ship3 = 5
maxDay = 0

for i in range (1, (ship1 + 1)):
    if ship1 % i == 0 and ship2 % i == 0:
        maxDay = i  # ship1 과 ship2의 최대공약수

print('최대공약수 : {}'.format(maxDay))

minDay = (ship1 * ship2) // maxDay
print('{},{}의 최소공배수 : {}'.format(ship1, ship2, minDay))

newDay = minDay

for i in range (1, (newDay + 1)):
    if newDay % i == 0 and ship3 % i == 0:
        maxDay = i  # ship1 과 ship2의 최대공약수

print('최대공약수 : {}'.format(maxDay))

minDay = (newDay * ship3) // maxDay
print('{}, {}, {}의 최소공배수 : {}'.format(ship1, ship2, ship3, minDay))

진법

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

2진법 → 0, 1 (2개 사용)
8진법 → 0, 1, 2, 3, 4, 5, 6, 7 (8개 사용)
10진법 → 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 (10개 사용)
16진법 → 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
A, B, C, D, E, F (16개 사용) (소문자도 상관 없음)

  • 10진수를 X진수로 변환

[10진수 → 2진수]

10진수 8을 2진수로 변환
2 [8]
2 [4]...0
2 [2]...0
   1...0
2진수 = 1000

10진수 17을 2진수로 변환
2 [17]
2 [8]...1
2 [4]...0
2 [2]...0
   1...0
2진수 = 10001

10진수 25를 2진수로 변환
2 [25]
2 [12]...1
2 [6]...0
2 [3]...0
   1...1
2진수 = 11001

[10진수 → 8진수]

10진수 8을 8진수로 변환
8 [8]
   1...0
8진수 = 10

10진수 17을 8진수로 변환
8 [17]
  [2]...1
8진수 = 21

10진수 25를 8진수로 변환
8 [25]
  [3]...1
8진수 = 31

[10진수 → 16진수]

10진수 8을 16진수로 변환
16 [8]
   0...8
16진수 = 8

10진수 17을 16진수로 변환
16 [17]
  [1]...1
16진수 = 11

10진수 25를 16진수로 변환
16 [25]
   [1]...9
16진수 = 19
  • X진수를 10진수로 변환

[2진수 → 10진수]

2진수 1000
[3승][2승][1승][0승]
[1][0][0][0]
(1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (0 * 2^0)
10진수 = 8

2진수 10001
[4승][3승][2승][1승][0승]
[1][0][0][0][1]
(1 * 2^4) + (0 * 2^3) + (0 * 2^2) + (0 * 2^1) + (1 * 2^0)
10진수 17

2진수 11001
[4승][3승][2승][1승][0승]
[1][1][0][0][1]
(1 * 2^4) + (1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (1 * 2^0)
10진수 25

[8진수 → 10진수]

8진수 10
[1승][0승]
[1][0]
(1 * 8^1) + (0 * 8^0)
10진수 = 8

8진수 21
[1승][0승]
[2][1]
(2 * 8^1) + (1 * 8^0)
10진수 17

8진수 31
[1승][0승]
[3][1]
(3 * 8^1) + (1 * 8^0)
10진수 25

[2진수 → 8진수]
뒤에서 부터 3자리씩 구분하고 빈 자리는 0으로 채운다.

뒤에서 부터 3자리씩 구분하고 빈 자리는 0으로 채운다.

2진수 1010100
[1][0][1][0][1][0][0]

[0][0][1] | [0][1][0] | [1][0][0]    3자리 씩 구분   빈자리 0
(0 * 2^2) + (0 * 2^1) + (1 * 2^0) 맨앞    1
(0 * 2^2) + (1 * 2^1) + (0 * 2^0) 중간    2
(1 * 2^2) + (0 * 2^1) + (0 * 2^0) 맨뒤    4
8진수 124 

[2진수 → 16진수]
뒤에서 부터 4자리씩 구분하고 빈 자리는 0으로 채운다.

2진수 1010100
[1][0][1][0][1][0][0]

[0][1][0][1] | [0][1][0][0]    4자리씩 구분   빈자리 0
(0 * 2^3) + (1 * 2^2) + (0 * 2^1) + (1 * 2^0) 맨앞    5
(0 * 2^3) + (1 * 2^2) + (0 * 2^1) + (0 * 2^0) 맨뒤    4
16진수 54 

진법(파이썬)

  • 10진수를 X진수로 변환

10진수 → 2진수, 8진수, 16진수


binary : bin() print('2진수: {}'.format(bin(dNum)))
octal : oct() print('8진수: {}'.format(oct(dNum)))
hexadecimal : hex() print('16진수: {}'.format(hex(dNum)))


결과 앞의 두글자는 진수를 뜻한다
2진수 : 0b1110
8진수 : 0o36
16진수 : 0x1e


변환 결과는 모두 문자열이다!!

dNum = 30

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

print('2진수: {}'.format(type(bin(dNum))))
print('8진수: {}'.format(type(oct(dNum))))
print('16진수: {}'.format(type(hex(dNum))))

# 진수를 변경하는 다른방법

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

print('{0:#b}, {0:#o}, {0:#x}'.format(dNum, dNum, dNum))
print('{0:#b}, {0:#o}, {0:#x}'.format(dNum))


# 숫자만 표현하고 싶을 때 #만 제거해주면 된다

print('2진수: {}'.format(format(dNum, 'b')))
print('8진수: {}'.format(format(dNum, 'o')))
print('16진수: {}'.format(format(dNum, 'x')))
  • X진수를 10진수로 변환

[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)))

이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.

profile
안녕하세요 반갑습니다^^

0개의 댓글