python[2주차-5일](중급 문제풀이8 , 기초수학1~3)

이동일·2023년 7월 18일

Python

목록 보기
9/10

코드 분석하는데 조금 오래 걸렸다.
블로그와 gpt를 이용해서 이해가 되지 않은 부분들을
집중 분석했다. 졸리다...^^

문제풀이8 등차수열

문제풀이8(텍스트파일2)

import time

def getTime():
    lt = time.localtime()  #현재 시간을 가져온다.
    st = time.strftime('%Y-%m-%d %H:%M:%S')  #strftime()에서  사용되는 형식 지정자  %I:시간   %M:분   %S:초   %p:오전 , 오후
    return st

while True:
    selectNumber = int(input('1.입금,\t 2.출금, \t 3.종료'))

    if selectNumber == 1:
        money = int(input('입금액 입력:'))
        with open('C:/pythonTxt/bank/money.txt', 'r') as f:  #읽기 모드로 열고 객체를 f로 지정한다.
            m = f.read()
            if m == '': #파일을 읽었는데 비어있으면 0으로 초기화 한다.
                m = '0'

        with open('C:/pythonTxt/bank/money.txt', 'w') as f:#쓰기모드로 파일 오픈
           f.write(str(int(m) + money))# 파일에 기존 금액(m)에 새로운 입금액을 더한 값을 문자열로 변환
                                        #m money.txt파일을 읽은 후 저장도니 문자열 형태의 기존 잔액을 나타낸다.



        memo = input('입금 내역 입력:')
        with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f: #파일 이어쓰기 a사용해서 열고 객체를 f로 지정
            f.write('------------------------------\n')
            f.write(f'{getTime()}\n')#현재 시간을 가져온다 (getTime함수)
            f.write(f'[입금] {memo}: {str(money)}원\n')#입금 내역과 금액을 파일에 기록
            f.write(f'[잔액] {memo}: {str(int(m) + money)}원\n')#잔액 내역과 금액을 파일에 기록

        print('입금 완료!!')
        print(f'기존 잔액: {m}')
        print(f'입금 후 잔액: {int(m) + money}')



    elif selectNumber == 2:
        money = int(input('출금액 입력:'))
        with open('C:/pythonTxt/bank/money.txt', 'r') as f:
            m = f.read()
            if m == '':
                m = '0'

        with open('C:/pythonTxt/bank/money.txt', 'w') as f:
            f.write(str(int(m) - money))

        memo = input('출금 내역 입력:')
        with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f:
            f.write('------------------------------\n')
            f.write(f'{getTime()}\n')
            f.write(f'[출금] {memo}: {str(money)}원\n')
            f.write(f'[잔액] {memo}: {str(int(m) - money)}원\n')

        print('입금 완료!!')
        print(f'기존 잔액: {m}')
        print(f'출금 후 잔액: {int(m)- money}')


    elif selectNumber == 3:
        print('BYE~')
        break
    else:
        print('다시 입력하세요!')

        

문제풀이8(텍스트파일3)


#약수 구하기
inputNumber = int(input('0보다 큰 정수 입력:'))


#약수
divisor = [] #약수 저장
for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:  # 약수확인 반복문 나머지가 0이면 약수
        divisor.append(number) #반복문에서 얻은 약수를 divisor 리스트에 저장


if len(divisor) > 0:
    try:
        with open('C:/pythonTxt/divisor.txt', 'a') as f:
            f.write(f'{inputNumber}의 약수:')
            f.write(f'{divisor} \n')

    except Exception as e:  # 문제 발생시 어떤 예외가 발생했는지 알기위해 Exception 사용
        print(e)
    else:
        print('divisor write complete!')

        

문제풀이8(텍스트파일3-1)

# #소수
inputNumber = int(input('0보다 큰 정수 입력:'))
prime = [] #소수 저장하기 위한 리스트 생성
for number in range(2, (inputNumber + 1)):
    flag = True #소수 여부를 위해 True 초기화

    for n in range(2, number):
        if number % n == 0:
            flag = False #숫자가 나누어지면 flag를 False로 변경하고 break로 반복문 종료
            break       #

    if flag:#True인 경우 숫자는 소수이므로 prime리스트에 append함수로 추가한다.
        prime.append(number)

if len(prime) > 0: #리스트 길이가 0보다 큰경우 소수가 있으므로 파일에 소수 저장
    try:           #0보다 작으면 else로 간다.
        with open('C:/pythonTxt/prime.txt', 'a') as f: #쓰기 a로 실행
            f.write(f'{inputNumber}까지의 소수:')
            f.write(f'{prime} \n')
    except Exception as e: #에러 메시지 발생
        print(e)
    else:
        print('prime write complete')

        

문제풀이8(텍스트파일4)

#수 두개의 공약수

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

common = [] #두 정수의 공약수를 저장하기 위한 공간
for i in range(1, (num1+1)):
    if num1 % i ==0 and num2 % i ==0 :# i로 나누어떨어지는지 확인한다. 두 수의 공약수 판별
        common.append(i) #조건문이 참이면 common 리스트에 i를 추가한다.

if len(common) > 0: # 0보다 크다는건 공약수를 찾았다는것(공약수가 존재하면 다음 작업 수행)
    try:
        with open('C:/pythonTxt/common.txt', 'a') as f:
            f.write(f'{num1}{num2}의 공약수: ')
            f.write(f'{common}\n')
    except Exception as e:
        print(e)
    else:
        print('common factor write complete!')
        

문제풀이8(텍스트파일4-2)


# # 수 두개의 최대공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))

maxComNum = 0

for i in range(1, (num1+ 1)):
    if num1 % i ==0 and num2 % i ==0 :
        maxComNum = i #위에서 얻은 i값을 maxComNum최대 공약수 변수에 초기화


try:
    with open('C:/pythonTxt/maxComNum.txt', 'a') as f:
         f.write(f'{num1}{num2}의 최대 공약수: {maxComNum}\n ')

except Exception as e:# try에서 예외 발생하면 실행
     print(e)
     #예외가 ZeroDivisionError 종류면  e에는 ZeroDivisionError가 들어있을것이다.
else:
    print('max common factor write complete!')
        

문제풀이8(텍스트파일4-3)


inputNumber = int(input('0보다 큰 정수 입력:'))


#약수
divisor = [] #약수 저장
for number in range(1, (inputNumber + 1)):
    if inputNumber % number == 0:  # 약수확인 반복문 나머지가 0이면 약수
        divisor.append(number) #반복문에서 얻은 약수를 divisor 리스트에 저장


if len(divisor) > 0:
    try:
        with open('C:/pythonTxt/divisor.txt', 'a') as f:
            f.write(f'{inputNumber}의 약수:')
            f.write(f'{divisor} \n')

    except Exception as e:  # 문제 발생시 어떤 예외가 발생했는지 알기위해 Exception 사용
        print(e)
    else:
        print('divisor write complete!')

        

문제풀이8(텍스트파일4-4)

#수 두개의 공약수

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

common = [] #두 정수의 공약수를 저장하기 위한 공간
for i in range(1, (num1+1)):
    if num1 % i ==0 and num2 % i ==0 :# i로 나누어떨어지는지 확인한다. 두 수의 공약수 판별
        common.append(i) #조건문이 참이면 common 리스트에 i를 추가한다.

if len(common) > 0: # 0보다 크다는건 공약수를 찾았다는것(공약수가 존재하면 다음 작업 수행)
    try: #예외처리
        with open('C:/pythonTxt/common.txt', 'a') as f:
            f.write(f'{num1}{num2}의 공약수: ')
            f.write(f'{common}\n')
    except Exception as e:
        print(e)
    else:
        print('common factor write complete!')


        

문제풀이8(텍스트파일4-5)


#배 입항 날짜
ship1= 3
ship2 = 4
ship3 = 5
maxDay = 0 #최대 공약수 초기값

for i in range(1, (ship1 + 1)): #1번배가 들어오는날까지 최대 공약수 구하기
    if ship1 % i == 0 and ship2 % i ==0: #ship1,ship2가 나누어떨어지면 maxDay변수에저장
        maxDay = i #1,2번 선박의 최대 공약수이다.(maxDay 최대 공약수)

minDay = (ship1 * ship2) // maxDay #최소 공배수

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

minDay = (newDay * ship3) // maxDay #배 3개에 대한 최소 공배수
print(f'minDay: {minDay}')  # 최소 공배수 출력
print(f'maxDay: {maxDay}')  # 최대 공약수 출력



from datetime import datetime
from datetime import timedelta

n = 1
baseTime = datetime(2021, 1, 1, 10, 0, 0)#현시간이 아닌 21년1월1일10시0분0초 기준
                                        #입항일 계산 위한 기준시간

with open('C:/pythonTxt/arrive.txt', 'a') as f:
    f.write(f'2021년 모든 선박 입항일 \n')
    f.write(f'{baseTime} \n')


nextTime = baseTime + timedelta(days=minDay) #다음 입항일을 계산하는데 사용
while True: #기록을 계속 반복

    with open('C:/pythonTxt/arrive.txt', 'a') as f:
        f.write(f'{nextTime}\n')

    nextTime = nextTime + timedelta(days=minDay)
    if nextTime.year > 2021:
        break


        

기초문제풀이1~3(실습)

기초문제풀이1~3(02 약수와소수)


inputNumber = int(input('0보다 큰 정수 입력: '))

for number in range(1, inputNumber + 1):
    if inputNumber % number == 0: # 사용자 입력값의 나머지가 0이되면 약수가 된다.
        print('{}의 약수: {}'.format(inputNumber, number))


        

02-1 약수와 소수


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
            break

    if flag:
        print('{}: 소수!!'.format(number))

    else:
        print('{}: 합성수!!'.format(number))


        

기초문제풀이1~3(04 소인수와 소인수분해)


소인수 구하기

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

n = 2 #소인수분해에서 가장작은수 2  (1은 제외)
while n <= inputNumber:
    if inputNumber % n ==0:
        print('소인수: {}'.format(n))
        inputNumber /= n #12 들어가면 2*6인데2는출력되고 6은 또 반복이 돈다 6은 -->2*3  --> 즉 먼저내려간다 2, 2*3  답은 2,2,3출력


    else:
        n +=1

        

기초문제풀이1~3(04-2 소인수와 소인수분해)

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

n = 2  #소인수분해는 2부터 시작함으로 n=2
searchNumbers = [] #x에 해당하는 정수들을 저장할 공간 리스트를 만들었다.
while n <= inputNumber: #소인수분해를 계속해서 진행하는 조건식
    if inputNumber % n ==0: #n이 inpurtNumber의 소인수인지 확인
        print('소인수: {}'.format(n))
        if searchNumbers.count(n) == 0:#count 매개변수에 어떤 숫자를 던지면 숫자가 해당리스트에 몇개가 있는지 반환한다.
                                     #리스트에 n이 존재하지 않은 경우 확인
                                     #0의 의미는 n이 searchNumbers에 없다는뜻

            searchNumbers.append(n)# 소인수를 저장

        elif searchNumbers.count(n) == 1: #리스트에 n이 한번 등장한 경우 확인
            searchNumbers.remove(n) #홀수를 구해야함으로 remove사용  예를들어 []에 2가2개있으면 제곱으로 뜨기에.. 필요한건 홀수여서

        inputNumber /= n #n을 소인수로 찾았으므로 inputNumber를 해당 소인수로 나누어 다음 소인수를 찾는다.


    else:
        n +=1


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

기초문제풀이1~3(06 최대공약수)


inputNumbers = input('두 개의 1보다 큰 정수 입력: ')
num1, num2 = map(int, inputNumbers.split())

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

        

기초문제풀이1~3(08 최소공배수)


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 # 입력 값을 곱하고 최대공약수를 나눈 몫을 구하고 minNum에 초기화 한다.

print('최소공배수:{}'.format(minNum))
        

기초문제풀이1~3(10 진법)


dNum = 20

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


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

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


#진수의 숫자만 출력하기
print('2진수: {}'.format(format(dNum, 'b')))
print('8진수: {}'.format(format(dNum, '#')))
print('16진수: {}'.format(format(dNum, 'x')))



        

기초문제풀이1~3(13 등차수열)

반복문 사용하여 등차수열 구하기


#반복문으로 등차 수열 구하기
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: ')) #구하고자 하는 n번째 값을 구한다.ex)7번째 :20


valueN = 0 #결과값 저장 변수
n = 1
while n <=inputN: #구하고자 하는 N항까지반복한다.

    if n ==1:
        valueN = inputN1 #첫항a1을 2 --> valueN = 2
        print('{}번째 항의 값: {}'.format(n, valueN))
        n +=1
        continue

    valueN += inputD #위에서 구한 valueN에 값(2)을 더한다.
                    #valueN=2 + 3 --> valueN =5 2번째항 5 출력
                    #3을 더하는 이유는 공차가 3이기 떄문
    
    print('{}번째 항의 값: {}'.format(n, valueN))
    n +=1

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





        

기초문제풀이1~3(13 등차수열-2 )

등차수열 공식 사용

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

valueN = 0

# an = a1 + (n-1)d
valueN = inputN1 + (inputN - 1) * inputD
print('{}번째 항의 값: {}'.format(inputN, valueN))





        

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정말 잘 읽었습니다, 고맙습니다!

답글 달기