230921_스터디노트

Sihyun Kim·2023년 9월 21일

기초수학 문제풀이

31_약수와 소수

import random

randN = random.randrange(100, 1000)
print(f'난수: {randN}')

divisorList = []
primeList = []
factList = []


for i in range(1, randN+1):

    factFlag = 0

    if randN % i == 0:              #약수
        divisorList.append(i)
        factFlag += 1

    if i != 1:                       #소수
        flag  = True
        for n in range(2, i):
            if i % n == 0:
                flag = False
                break

        if flag:
            primeList.append(i)
            factFlag += 1

    if factFlag == 2:               #소인수
        factList.append(i)


print(f'약수: {divisorList}')
print(f'소수: {primeList}')
print(f'소인수: {factList}')
  • 마지막에 소인수 찾는 과정:
    flag를 for문 바로 아래에 넣어서, 한번 돌고 오면 다시 0으로 만들고,
    if문 거치면서 2가 되면 (둘 다 해당되면) 소인수라고 판명하는 방법! 🎇 기억할 것!

32_소인수와 소인수분해

  • 랜덤 숫자를 소인수 분해 했을 때, 지수만 뽑아내기
import random

rNum = random.randint(100, 1000)
print(f'rNum: {rNum}')

factorList = []

n = 2
while n <= rNum:
    if rNum % n == 0:
        print(f'소인수: {n}')
        factorList.append(n)

        rNum /= n

    else: n += 1

print(factorList)

tempNum = 0
for factor in factorList:
    if tempNum != factor:
        print(f'{factor}의 개수: {factorList.count(factor)}')
        tempNum = factor
  • 리스트 안에 있는 값이 뭔지 알고 하나씩 대입해서 세는게 아니라,
    특정 숫자(tempNum)가 아니면 그 숫자 갯수를 세고 그 숫자가 그래서 뭔지 print한 다음에
    다시 tempNum에 방금 뽑은 숫자를 대입해서 똑같이 돌린다..
    😲 생각하는 방법을 다양하게 열어야 한다!!

33_최대공약수

  • 100부터 1000까지의 2개의 난수에 대해 공약수과 최대 공약수를 출력하고, 서로소인지 출력하는 프로그램
import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)

print(f'rNum1: {rNum1}')
print(f'rNum2: {rNum2}')

commonList = []
maxCommon = 0

for i in range(1, min(rNum1, rNum2)+1):
    if rNum1 % i == 0 and rNum2 % i == 0:
       commonList.append(i)
       maxCommon = i


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

if maxCommon == 1:
    print(f'두 수는 서로소이다')

else: print(f'두 수는 서로소가 아니다')
  • min()을 몰라서 if문으로 두가지 경우를 구분해서 만들었다가 풀이 보고 수정함!

34_최소공배수

import random

rNum1 = random.randint(100, 1000)
rNum2 = random.randint(100, 1000)

print(f'rNum1: {rNum1}')
print(f'rNum1: {rNum2}')

maxCommon = 0
minCommon = 0

for i in range(1, min(rNum1, rNum2)+1):
    if rNum1 % i == 0 and rNum2 % i == 0:
        maxCommon = i

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

minCommon = int(rNum1 * rNum2 / maxCommon)

print(f'최소공배수: {minCommon}')
  • 최소공배수 = num1 * num2 / 최대공약수

35_진법

userNum = int(input('10진수 숫자 입력: '))

print(f'2진수: {bin(userNum)}')
print(f'8진수: {oct(userNum)}')
print(f'16진수: {hex(userNum)}')

print('2진수(0b11001) -> 10진수({})'.format(int('0b11001', 2)))
print('8진수(0o31) -> 10진수({})'.format(int('0o31', 8)))
print('16진수(0x19) -> 10진수({})'.format(int('0x19', 16)))

print('8진수(0o31) -> 16진수({})'.format(hex(0o31)))
10진수 숫자 입력: 25
2진수: 0b11001
8진수: 0o31
16진수: 0x19
2진수(0b11001) -> 10진수(25)
8진수(0o31) -> 10진수(25)
16진수(0x19) -> 10진수(25)
8진수(0o31) -> 16진수(0x19)

36_등차수열

userA1 = int(input('첫번째 항 입력: '))
userD = int(input('공차 입력: '))
userN = int(input('n 입력: '))

valueN = 0
sumN = 0

for i in range(1, userN+1):
    if i == 1:
        valueN = userA1
        sumN += valueN

    else:
        valueN += userD
        sumN += valueN


print(f'{userN}번째 항의 값: {valueN}')
print(f'{userN}번째 항까지의 합: {sumN}')

37_등비수열

userA1 = int(input('첫번째 항 입력: '))
userR = int(input('공비 입력: '))
userN = int(input('n 입력: '))

valueN = 1
sumN = 0
n = 1


while n <= userN:

    if n == 1:
        valueN = userA1
        sumN += valueN

    else:
        valueN *= userR
        sumN += valueN

    n += 1

print(f'{userN}항의 값: {valueN}')
print(f'{userN}항까지의 합: {sumN}')

자료구조

10_리스트에 아이템 추가

  • append() 함수를 이용하면 마지막 인덱스에 아이템 추가 가능
myFamAge = [['아빠', 40], ['엄마', 38], ['나', 9]]
myFamAge.append(['동생', 1])

for mem, age in myFamAge:
    print(f'{mem}의 나이: {age}')

11_리스트의 특정 위치에 아이템 추가

  • insert() 함수를 이용하면 특정 위치(인덱스)에 아이템 추가 가능
myFamAge = [['아빠', 40], ['엄마', 38], ['나', 9]]
myFamAge.append(['동생', 1])
myFamAge.insert(2, ['언니', '15'])

for mem, age in myFamAge:
    print(f'{mem}의 나이: {age}')
  • 오름차순으로 리스트에 입력
numbers = [1, 3, 6, 11, 45, 54, 62, 74, 85]
userNum = int(input('숫자 입력: '))

insertIdx = 0

for idx, value in enumerate(numbers):
    if userNum > value:
        insertIdx = idx + 1

numbers.insert(insertIdx, userNum)
print(numbers)
  • 풀이랑 다르게 userNum이 value보다 크면 그 다음 인덱스에 넣기로 함

12_리스트의 아이템 삭제

pop() 함수를 이용하면 마지막 인덱스에 해당하는 아이템을 삭제
pop(n) 함수로 n인덱스에 해당하는 아이템을 삭제

playerScore = [9.5, 8.9, 9.2, 9.8, 8.8, 9.0]

maxScore = 0
maxIdx = 0
minScore = 0
minIdx = 0

for idx, score in enumerate(playerScore):

    if idx == 0:
        maxScore = score

    if score > maxScore:
        maxScore = score
        maxIdx = idx

playerScore.pop(maxIdx)

for idx, score in enumerate(playerScore):

    if idx == 0:
        minScore = score

    if score < minScore:
        minScore = score
        minIdx = idx

playerScore.pop(minIdx)


print(playerScore)
  • 마지막에 삭제하려니, 구해놓은 인덱스가 다 틀어짐!
    어쩔 수 없이 for문을 두 번 각각 돌려서 값을 구한다!
profile
문과이과예체능통합형인재

0개의 댓글