자료구조 알고리즘 공부 4주차

파이썬

자료구조 알고리즘 공부 4주 차에 대한 이야기이다.

다음 주부터 컴활 1급 공부와 독학사 2단계 공부 때문에 자. 구. 알 공부를 잠시 멈춰야 할 것 같다.

어느 정도 기초공부를 마무리하고 싶어서  이번 주에는 일단 계획을 조금 타이트하게 잡았는데,

그래도 맞춰서 일단 진행할 수 있었다.

 

#11일차

#최댓값 구하기1
a = [2,3,1]

maximum = a[0]
if a[1] > maximum : maximum = a[1]
if a[2] > maximum : maximum = a[2]

maximum

#최댓값 구하기2
a = [2,3,1]

maximum = a[0]
for i in range(1,len(a)):
    if a[i] > maximum :
        maximum = a[i]

maximum

#최댓값 구하기 함수 정의
from typing import Any, Sequence

def max_of(a: Sequence) -> Any :
    maximum = a[0]
    for i in range(1,len(a)):
        if a[i] > maximum :
            maximum = a[i]
        return maximum
    
if __name__ == '__main__':
    print('배열의 최대값을 구합니다')
    num = int(input('원소의 수를 입력하세요 :'))
    x = [None] * num
    
    for i in range(num):
        x[i] = int(input(f'{i+1}번째 값을 입력하세요:'))
    
    print(f'최대값은 {max_of(x)} 입니다')
#12일차

#최댓값 구하기 함수 활용1
from max import max_of

print('배열의 최댓값')
print('End 입력시 종료')

number = 1
x=[]

while True:
    s = input(f'{number}번째 값을 입력하세요.:')
    if s == 'End':
        break
    x.append(int(s))
    number = number + 1

print(f'{number}개가 입력되었습니다')
print(f'최대값은 {max_of(x)}입니다')

#최댓값 구하기 함수 활용2
import random
from max import max_of

print('난수의 최대값')
num = int(input('난수의 개수'))
lo = int(input('난수의 최솟값'))
hi = int(input('난수의 최댓값'))
x = [None] * num

for i in range(num):
    x[i] = random.randint(lo,hi)

print(f'{(x)}')
print(f'이 가운대 최댓값은 {max_of(x)}입니다.')

#최댓값 구하기 함수 활용3
from max import max_of

t = (4,2,6,3.14,2.7,1)
s = 'string'
a = ['dts', 'aac', 'flac']

print(f'{t}의 최대값은 {max_of(t)}입니다')
print(f'{s}의 최대값은 {max_of(s)}입니다')
print(f'{a}의 최대값은 {max_of(a)}입니다')
#13일차

#리스트 동일성 판단
lst1 = [1,2,3,4,5]
lst2 = [1,2,3,4,5]
lst1 is lst2

lst1 = [1,2,3,4,5]
lst2 = lst1
lst1 is lst2

#리스트 성질1
x = ['john', 'george', 'paul', 'ringo']

for i in range(len(x)):
    print(f'x[{i}]= {x[i]}')

#리스트 성질2
x = ['john', 'george', 'paul', 'ringo']

for i, name in enumerate(x):
    print(f'x[{i}]= {name}')

#리스트 성질3
x = ['john', 'george', 'paul', 'ringo']

for i, name in enumerate(x,1):
    print(f'{i}번째 = {name}')

#역순 정렬 함수
from typing import Any, MutableSequence

def reverse_array(a: MutableSequence)-> None:
    n = len(a)
    for i in range(n//2):
        a[i], a[n-i-1]=a[n-i-1],a[i]
        
if __name__ == '__main__':
    print('배열 원소를 역순 정렬')
    nx = int(input('원소 수:'))
    x = [None] * nx
    
    for i in range(nx):
        x[i] = int(input(f'x[{i}]값을 입력하세요:'))
        
    reverse_array(x)
    
    print('원소 배열을 역순으로 정렬완료')
    for i in range(nx):
        print(f'x[{i}]={x[i]}')
#14일차

#진수 변환 함수 정의
def card_conv(x: int, r: int) -> str:
    d=''
    dchar='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    
    while x>0:
        d= d+dchar[x%r]
        x //= r
        
    return d[::-1]

#진수 변환 함수 활용
if __name__=='__main__':
    print('10진수를. n진수로 변환')
    
    while True:
        while True:
            no = int(input('변환할 음이 아닌 정수:'))
            if no > 0 :
                break
                
        while True:
            cd = int(input('어떤 진수? :'))
            if 2 <= cd <= 36 :
                break
                
        print(f'{cd}진수로는 {card_conv(no, cd)}입니다')
        
        retry = input("한 번 더 변환 ? (y/n)")
        if retry in {'N', 'n'}:
            break
print('실행 끝')
#15일차

#1부터 정수합 함수 정의1
def sum_1ton(n):
    s=0
    while n>0:
        s=s+n
        n=n-1
    return s

x= int(input('x의 값 :'))
print(f'1부터 {x}까지 합은 {sum_1ton(x)}')

#1부터 정수합 함수 정의2
def sum_1ton(n):
    s=0
    for i in range(n+1):
        s = s+i
    return s

x= int(input('x의 값 :'))
print(f'1부터 {x}까지 합은 {sum_1ton(x)}')

#인덱스 업데이트
def change(lst, idx, val):
    lst[idx]=val
    
x = [11,22,33,44,55]
print('x=',x)

index = int(input('업데이트할 인덱스 선택:'))
value = int(input('새로운 값을 입력 :'))

change(x, index, value)
print(f'x={x}')

#소수탐색 알고리즘
counter = 0

for n in range(2,1001):
    for i in range(2,n):
        counter = counter+1
        if n% i == 0:
            break
    else :
        print(n)
        
print(f'나눗셈 실행 횟수:{counter}')

#소수탐색 알고리즘 개선1
counter = 0
ptr=0
prime = [None]*500

prime[ptr] = 2
ptr = ptr+1

for n in range(3,1001,2):
    for i in range(1,ptr):
        counter = counter+1
        if n % prime[i] == 0:
            break
    else :
        prime[ptr] = n
        ptr = ptr + 1
        
for i in range(ptr):
    print(prime[i])
    
print(f'나눗셈 실행 횟수:{counter}')

#소수탐색 알고리즘 개선2
counter = 0
ptr=0
prime = [None]*500

prime[ptr] = 2
ptr = ptr+1

prime[ptr] = 3
ptr = ptr+1

for n in range(5,1001,2):
    i=1
    while prime[i] * prime[i] <=n:
        counter = counter+2
        if n % prime[i] == 0:
            break
        i=i+1
    else :
        prime[ptr] = n
        ptr = ptr + 1
        counter = counter+1
        
for i in range(ptr):
    print(prime[i])
    
print(f'나눗셈 실행 횟수:{counter}')

#리스트 원소와 복사
x= [15,64,7,3.14,[32,55],'abc']
for i in range(len(x)):
    print(f'x[{i}]={x[i]}')

4주차 느낌 :

4주 동안 짧게나마 자료구조의 기초를 알 수 있어서 좋았다.

컴활과 독학사 2단계 즉, 학점은행제가 어느 정도 마무리되면 다시 파이썬 공부를 이어가야겠다.

그때는 이제 검색 알고리즘부터 진짜가 시작할 것 같다.