기초수학 문제풀이
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문을 두 번 각각 돌려서 값을 구한다!