7 minute read

공학도를 위한 창의적컴퓨팅에서 진행한 Python 실습 내용들

기초

10000초 → 시,분,초

sec = 10000
min = sec/60
min = int(min)
sec = sec - min*60
hour = min/60
hour = int(hour)
min = min - hour*60
print(hour,'시간',min,'분',sec,'초')

피보나치 수열

num = int(input('항의 개수를 입력: '))
print('피보나치 수열: ', end = ' ')
first = 1
second = 1
cal = first + second
print(first, second, cal, end= ' ')

i=0
while(i<num-3):
	first = second
	second = cal
	cal = first + second
	print(cal, end = ' ')
	i+=1

트리

story = int(input('몇층의 트리를 출력?'))

i=0
while(i<story):
	print('-'*(story-(i+1))+'*'*(2*(i+1)-1))
	i+=1

리스트

a리스트 요소 값들은 b 리스트 요소들이 c 리스트에 위치되어야 하는 index 값

Untitled

a = [ 5, 6, 0, 3, 1, 2, 4 ]
b = ['키', '~', '내','든','가','만','쿠']
c = [0,0,0,0,0,0,0]

c[a[0]] = b[0]
c[a[1]] = b[1]
c[a[2]] = b[2]
c[a[3]] = b[3]
c[a[4]] = b[4]
c[a[5]] = b[5]
c[a[6]] = b[6]
c = ''.join(c)
print(c)

str요소변경하기(replace사용불가)

a = input('문자열을 입력하세요:')
b = input('변경할 문자를 입력하세요:')
c = input('무엇으로 변경할 것인지 입력하세요:')

a = a.split(' ')
a[a.index('식사는')] = c
a = ' '.join(a)
print(a)

행렬

행렬의 곱

Untitled

A =[[4,2,1],[6,7,1],[2,5,6]]
b = [1,4,2]
c = [0,0,0]

c[0] = A[0][0]*b[0] + A[0][1]*b[1] + A[0][2]*b[2]
c[1] = A[1][0]*b[0] + A[1][1]*b[1] + A[1][2]*b[2]
c[2] = A[2][0]*b[0] + A[2][1]*b[1] + A[2][2]*b[2]
print('c리스트는', c)

행렬을 이용한 연립방정식 계산

Untitled

A1 = [[0,0],[0,0]]
B1 = [0,0]
C1 = [0,0]

A1[0][0] = float(input('a값을 입력하세요'))
A1[0][1] = float(input('b값을 입력하세요'))
A1[1][0] = float(input('c값을 입력하세요'))
A1[1][1] = float(input('d값을 입력하세요'))
C1[0] = float(input('f값을 입력하세요'))
C1[1]= float(input('g값을 입력하세요'))

det = 1/(A1[0][0] * A1[1][1] - A1[0][1]*A1[1][0])
B1[0] = A1[1][1]*C1[0] + (-1)*A1[0][1]*C1[1]
B1[1] = (-1)*A1[1][0]*C1[0] + A1[0][0]*C1[1]
B1[0] = B1[0]*det
B1[1] = B1[1]*det

print('x=%.3f'%(B1[0]))
print('y=%.3f'%(B1[1]))

정방행렬

num = int(input('행렬의 사이즈를 입력하세요:'))
a = []

sum=1
j=0
while(j<num):
	a.append([])
	i=0
while(i<num):
	a[j].append(sum)
	sum+=1
	i+=1
j+=1

print(a)

행렬 형태로 출력

a = []
for i in range(len(a)):
	for j in range(len(a[i])):
		print(a[i][j], end= ' ')
	print()

적분

Untitled

a=float(input('a: '))
b=float(input('b: '))
c=float(input('c: '))
start=float(input('어디부터'))
end=float(input('어디까지'))
div=int(input('몇 개로 나눌지'))
d=(end-start)/div

area=0
for i in range(div):
    h1=a*((start+(i*d))**2)+b*(start+(i*d))+c
    h2=a*((start+((i+1)*d))**2)+b*(start+((i+1)*d))+c
    area+=(h1+h2)*d/2
print(area)

Untitled

node = [[1,4],[8,6],[11,3.1],[14,-6],[20,6],[22,7]]
y=1
area=0
for i in range(1,len(node)):

    if((node[i][1]*node[i-1][1])<0): #y좌표가 -인지는 곱해서 확인해야함
        y=0
    else:
        y=1
    if(y==1):
        d=node[i][0]-node[i-1][0]
        h=node[i-1][1]+node[i][1]
        area+=d*h/2
    else:
        a=(node[i][1]-node[i-1][1])/(node[i][0]-node[i-1][0])
        b=node[i][1]-(a*node[i][0])
        x=-1*b/a
        print('x절편',x)
        d1=x-node[i-1][0]
        d2=node[i][0]-x
        h1=abs(node[i-1][1])
        h2=abs(node[i][1])
        area1=d1*h1/2
        area2=d2*h2/2
        area+=area1+area2
print(area)

matplot

이차함수 그리기

import matplotlib.pylab as plt
import math

a = 0.01
b = 0.1
c = 0.2

x = range(0,100)
y = []
for i in x:
	y.append(a*math.pow(i,2)+b*i+c)

plt.plot(x,y, c='r', label='y='+str(a)+'x^2+'+str(b)+'x+'+str(c))
plt.legend(loc=2)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

정다각형 그리기

import matplotlib.pylab as plt
import math

n = range(4,10,2)

for j in n:
	x = []
	y = []
	r = 1

	theta = 360/j*math.pi/180

	for i in range(j):
		x.append(r * math.cos(theta*i))
		y.append(r * math.sin(theta*i))
	x.append(r*math.cos(0))
	y.append(r*math.sin(0))

	plt.plot(x,y, label= str(j) + " sided polygon")

plt.legend(loc=1)
plt.title("Regular polygon")

plt.show()

이상 교수님의 코드가 많으니 주의

최대최소, 약수, 배수, 소수

#1. max, min
a=[4,3,-7.8,9,10,11]
max=a[0]
min=a[0]
for i in range(len(a)):
    if (a[i]>max):
        max=a[i]
    if (a[i]<min):
        min=a[i]
print(max)
print(min)

#2. 약수구하기
a=int(input('val: '))
for i in range(1,a+1):
    if(a%i==0):
        print(i,end=' ')

#3. 약수의 개수
a=int(input('val: '))
b=0
for i in range(1,a+1):
    if(a%i==0):
        b+=1
print(b)

#4. 최대공약수
a=int(input('val1: '))
b=int(input('val2: '))
c=[]
d=[]
for i in range(1,a+1):
    if(a%i==0):
        c.append(i)
for i in range(1,a+1):
    if(b%i==0):
        d.append(i)
for i in range(len(c)):
    for j in range(len(d)):
        if(c[i]==d[j]):
            sh=c[i]
print(sh)

    #함수를 사용해서 풀어보자-이거 손필기하면 좋을 듯
def sh1(a,b): #여기서 b에 append하면 c에 append 되는 것
    for i in range(a):
        if(a%(i+1)==0):
            b.append(i+1) #void fn.   
a=int(input('val1: '))
b=int(input('val2: '))
c=[] #c에는 주소가 들어있음
sh1(a,c)
d=[]
sh1(b,d)

    #return형 함수 이용, 얘가 더 편해서 이렇게 더 많이 씀
def sh2(a): #지역변수는 c,a a는 parameter이기도 함
    c=[]
    for i in range(a):
        if(a%(i+1)==0):
            c.append(i+1)
    return c #return fn.
a=int(input('val1: '))
b=int(input('val2: '))
c=sh2(a) #함수에서 만든 리스트의 주소가 밖의 c로 오는 것
d=sh2(b)
maxsh=0
for i in range(len(c)):
    for j in range(len(d)): #break 없으면 24번 돌았는데 비효율적임
        if(c[i]==d[j]):
            maxsh=c[i]
            break
        if(c[i]<d[j]): #이 때는 돌릴 필요 없음
            break
print(maxsh)

#5. 최소공배수
def mul(n,max):
    N=[]
    for i in range(1,int((max/n)+1)):
        N.append(n*i)
    return N
state=1
a=int(input('val1: '))
b=int(input('val2: '))
max=a*b
A=mul(a,max)
B=mul(b,max)
for i in range(len(A)):
    for j in range(len(B)):
        if(A[i]==B[j]):
            min=A[i]
            state=0
            break
        if(A[i]<B[j]): 
            break
    if(state==0):
        break
print(min)

#6. 2,431,161 = 소수1*소수2일 때 소수1, 소수2를 찾아라
def numsh(a): #소수인지 판단 -> 약수 2개인가
    b=0
    for i in range(1,a+1):
        if(a%i==0):
            b+=1
    if(b==2):
        return 1
    else:
        return 0

num=int(input('val: '))
i=1
while(1):
    if(numsh(i)==1):
        if(num%i==0):
            print(i, end=', ')
            print(int(num/i))
            break
    i+=1
  • 소수 찾을 때는 약수가 2개인지로 찾기
  • 최소공배수 비교할 때 이미 대소가 판별났을 때 굳이 안 하면 줄일 수 있음
  • 정수/정수 → 실수로 나옴

미분

end=4
start=0
slope=(end**2-start**2)/(end-start)
slope_old=0
while(1):
    start=(end+start)/2
    slope=(end**2-start**2)/(end-start)
    if(abs(slope-slope_old)<0.001):
        print(start,slope)
        break
    slope_old=slope #꼭 여기 있어야함

정렬 - p63

def selection_sort(a):
    for j in range(len(a)-1):
        for i in range(j+1,len(a)):
            if(a[j]>a[i]):
                a[j],a[i]=a[i],a[j]

def bubble_sort(a):
    for j in range(len(a),0,-1):
        for i in range(j-1):
            if(a[i]>a[i+1]):
                a[i],a[i+1]=a[i+1],a[i]

병합 정렬

# 병합정렬 - a,b를 미리 sort한 상태에서 해야함, 하나가 다 되면 나머지 하나의 나머지를 걍 뒤에 붙임
a = [6,8,2,4,13,11]
b = [3,9,21,4,16,1,2]
c=[]
p1=0
p2=0

bubble_sort(a)
bubble_sort(b)

while(1): #break 안쓰고 1대신에 (len(c) < len(a) + len(b)) 넣어도 됨
    if(a[p1]>b[p2]):
        c.append(b[p2])
        if(p2<len(b)-1):
            p2+=1
        else:
            for i in range(p1,len(a)):
                c.append(a[i])
            break
    else:
        c.append(a[p1])
        if(p1<len(a)-1):
            p1+=1
        else:
            for i in range(p2,len(b)):
                c.append(b[i])
            break
print(c)

검색 - p68

순차 검색

a=[5,7,15,28,29,31,39,8,2,3]
for i in range(len(a)):
    if(a[i]==8):
        print('index:',i)
        break

이진 검색

a=[5,7,15,28,29,31,39,58,68,70,95]
find=70
start=0
end=len(a)-1
while(1):
    pivot=int((start+end)/2)
    print(pivot)
    if(a[pivot]==find):
        print('find', find)
        break
    elif(a[pivot]>find):
        end=pivot
    else:
        start=pivot

난수, random

start=3
end=10
for i in range(3):
    print(int(random.random()*(end-start)+start))

중복 없는 난수

def existence(ran,a):
    for i in range(len(a)):
        if(a[i]==ran):
            return 1
    return 0
    
a=[]
end=5
while(1):
    ran=int(random.random()*5)
    print('ran:',ran)
    print(existence(ran,a))
    if(existence(ran,a)):
        continue      
    else:
        a.append(ran)

    if(len(a)==5):
        break
print(a)

넓이, 겉넓이

3차원에서 세 점이 주어졌을 때

def area(a,b,c): # 3차원에서 세 점이 주어졌을 때 넓이
    m = (b[1]-a[1])*(c[2]-a[2]) - (b[2]-a[2])*(c[1]-a[1])
    n = (b[0]-a[0])*(c[2]-a[2]) - (b[2]-a[2])*(c[0]-a[0])
    p = (b[0]-a[0])*(c[1]-a[1]) - (b[1]-a[1])*(c[0]-a[0])
    aa = 0.5*(abs((m**2 + n**2 + p**2)**0.5))
    return aa

area_sum = 0 # 겉넓이- 구나 삼각형에서 사용
for i in range(len(element)):
    a = node[element[i][0]]
    b = node[element[i][1]]
    c = node[element[i][2]]
    area_sum += area(a,b,c)
print(area_sum)

2차원에서 세 점이 주어졌을 때

def area(a,b,c):
    aa = 0.5*(abs((a[0]*b[1]+b[0]*c[1]+c[0]*a[1]) - (a[0]*c[1]+c[0]*b[1]+b[0]*a[1])))
    return aa

사각형도 삼각형 2개로 나눠서 이걸로 구하면 됨

txt파일 읽어와서 node, element 추가

a = open('input.txt', 'r')
node_num = int(a.readline().split(' ')[1])
dummy = a.readline() # 쓸데없지만 다음거 읽으려고 읽어옴

node = []
for i in range(node_num):
    b = a.readline().split(',')
    node.append([float(b[1]), float(b[2]), 0])

element_num = int(a.readline().split(' ')[1])
dummy = a.readline()

element = []
for i in range(element_num):
    b = a.readline().split(',')
    element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함

a.close()

matplot

등가속도운동 물체의 d,v,a

t = range(10) #간격 좁게 할수록 부드럽게 나옴
force = []
for i in t:
    force.append(2)

a1 = []
mass1 = 0.5
a2 = []
mass2 = 1.5
for i in t:
    a1.append(force[i]/mass1)
    a2.append(force[i]/mass2)

plt.plot(t, a1, label='time-accelerate{mass1}', c='b', )
plt.plot(t, a2, label='time-accelerate{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('accelerate(m/sec^2)')
plt.xlim(0,10)
plt.ylim(0,10)
plt.show()

def area_sq(h1, h2, d):
    area = (h1+h2)*d/2
    return area

def integral(a):
    area_sum = 0
    s = [0]
    for i in range(1, len(t)):
        area_sum += area_sq(a[i-1], a[i], t[i]-t[i-1])
        s.append(area_sum) #이렇게 단위로 자르고, 누적을 해야 가속도가 일정하지 않을 때도 일반화 가능
    return s

v1 = integral(a1)
v2 = integral(a2)

d1 = integral(v1)
d2 = integral(v2)

plt.plot(t, v1, label='time-velocity{mass1}', c='b', )
plt.plot(t, v2, label='time-velocity{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('velocity(m/sec)')
plt.xlim(0,10)
plt.ylim(0,40)
plt.show()

plt.plot(t, d1, label='time-displacement{mass1}', c='b', )
plt.plot(t, d2, label='time-displacement{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('displacement(m)')
plt.xlim(0,10)
plt.ylim(0,160)
plt.show()

print('v1: ', v1)
print('d1: ', d1)

순간적인 힘

t = []
for i in range(1000):
    t.append(i/100)

force = []
for i in t:
    if(i==0.1):
        force.append(10)
    else:
        force.append(0)

a1 = []
mass1 = 0.5
a2 = []
mass2 = 1.5
for i in range(len(t)):
    a1.append(force[i]/mass1)
for i in range(len(t)):
    a2.append(force[i]/mass2)

plt.plot(t, a1, label='time-accelerate{mass1}', c='b', )
plt.plot(t, a2, label='time-accelerate{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('accelerate(m/sec^2)')
plt.xlim(0,10)
plt.ylim(0,50)
plt.show()

def area_sq(h1, h2, d):
    area = (h1+h2)*d/2
    return area

def integral(a):
    area_sum = 0
    s = [0]
    for i in range(1, len(t)):
        area_sum += area_sq(a[i-1], a[i], t[i]-t[i-1]) #t의 간격에 따라 적분이 다르게 되는 게 정상
        s.append(area_sum)
    return s

v1 = integral(a1)
v2 = integral(a2)

d1 = integral(v1)
d2 = integral(v2)

plt.plot(t, v1, label='time-velocity{mass1}', c='b', )
plt.plot(t, v2, label='time-velocity{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('velocity(m/sec)')
plt.xlim(0,10)
plt.ylim(0,5)
plt.show()

plt.plot(t, d1, label='time-displacement{mass1}', c='b', )
plt.plot(t, d2, label='time-displacement{mass2}', c='r', )

plt.legend(loc = 2)
plt.xlabel('time(sec)')
plt.ylabel('displacement(m)')
plt.xlim(0,10)
plt.ylim(0,10)
plt.show()

print('a1: ', a1[1])
print('v1: ', v1[1])
print('d1: ', d1[1])

꼭짓점이 어느 도메인에 있는가 - 전체 코드

# read
rd = open('input.txt', 'r')

node_num = int(rd.readline().split(' ')[1])
dummy = rd.readline() # 쓸데없지만 다음거 읽으려고 읽어옴
node = []
for i in range(node_num):
    b = rd.readline().split(' ')
    node.append([float(b[1]), float(b[2])])
dummy = rd.readline()

element_num = int(rd.readline().split(' ')[1])
dummy = rd.readline()
element = []
for i in range(element_num):
    b = rd.readline().split(' ')
    element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1, int(b[4])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함
dummy = rd.readline()

particle_num = int(rd.readline().split(' ')[1])
dummy = rd.readline()
particle = []
for i in range(particle_num):
    b = rd.readline().split(' ')
    particle.append([float(b[1]), float(b[2])])

rd.close()

# 넓이
def area(a,b,c):
    aa = 0.5*(abs((a[0]*b[1]+b[0]*c[1]+c[0]*a[1]) - (a[0]*c[1]+c[0]*b[1]+b[0]*a[1])))
    return aa

def where(n):   
    for j in range(42):
        area_sum = 0
        for i in range(3):
            area_sum += area(node[element[j][i]], node[element[j][i+1]],particle[n])
        area_sum += area(node[element[j][0]], node[element[j][3]],particle[n])
        
        if(int(area_sum) == int(area_sq[j])):
            domain = j+1
            return domain 

area_sq = [] # 사각형 2개 넓이
for i in range(len(element)):
    
    area_sq.append(area(node[element[i][0]], node[element[i][1]], node[element[i][2]])
                + area(node[element[i][0]], node[element[i][3]], node[element[i][2]])
                    )

# 도메인 찾기
domain = []
for i in range(len(element)):
    domain.append([])

for n in range(len(particle)):
    domain[where(n)-1].append(n+1)

# write
wt = open('output.txt', 'w')

for j in range(len(domain)):
    print('domain',j+1)
    wt.write('domain'+str(j+1))
    wt.write('\n')
    for i in range(len(domain[j])):
        print(domain[j][i],end=' ')
        wt.write(str(domain[j][i])+' ')
    print()
    wt.write('\n')

wt.close()

float끼리 같은지 비교해야하는데 소숫점이 너무 많아서 같은데 미묘한 차이로 비교를 못할 수도 있음 - int화 시켜서 비교해야함