4.23
오늘 수강한 분량: 알고리즘 1~4
<알고리즘>
: 수학, 컴퓨터과학, 언어학 또는 엮인 분야에서 어떠한 문제를 풀어맺기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것
<선형검색>
: 선형으로 나열되어 있는 데이터를 순차적으로 스캔하면서 원하는 값을 찾는다.
ex. 선형검색 코드 만들어보기
datas = [3,2,5,7,9,1,0,8,6,4]
print(f'datas: {datas}')
print(f'datas length: {len(datas)}')
searchData = int(input('찾으려는 숫자 입력: '))
searchResultIdx = -1
n = 0
while True:
if n == len(datas):
searchResultIdx = -1
break
elif datas[n] == searchData:
searchResultIdx = n
break
n += 1
print(f'searchResultIdx: {searchResultIdx}')
ex. nums.append(searchData)
<이진검색>
: 정렬되어 있는 자료구조에서 중앙값과의 크고 작음을 이용해서 데이터 검색
ex.
datas = [1,2,3,4,5,6,7,8,9,10,11]
print(f'datas: {datas}')
print(f'datas length: {len(datas)}')
searchData = int(input('search data: '))
searchResultIdx = -1
staIdx = 0
endIdx = len(datas) - 1
midIdx = (staIdx + endIdx) // 2
midVal = datas[midIdx]
print(f'midIdx: {midIdx}')
print(f'midVal: {midVal}')
while searchData <= datas[len(datas)-1] and searchData >= datas[0]:
if searchData == datas[len(datas)-1]:
searchResultIdx = len(datas) -1
break
elif searchData > midVal:
staIdx = midIdx
midIdx = (staIdx + endIdx) // 2
midVal = datas[midIdx]
print(f'midIdx: {midIdx}')
print(f'midVal: {midVal}')
elif searchData < midVal:
endIdx = midIdx
midIdx = (staIdx + endIdx) // 2
midVal = datas[midIdx]
print(f'midIdx: {midIdx}')
print(f'midVal: {midVal}')
elif searchData == midVal:
searchResultIdx = midIdx
break
print(f'searchResultIdx: {searchResultIdx}')
<순위>
: 수의 크고 작음을 이용해서 수의 순서를 정하는 것
ex
import random
nums = random.sample(range(50,101),20)
ranks = [0 for i in range(20)]
print(f'nums: {nums}')
print(f'ranks: {ranks}')
for idx, num1 in enumerate(nums):
for num2 in nums:
if num1 < num2:
ranks[idx] += 1
print(f'nums: {nums}')
print(f'ranks: {ranks}')
for idx, num in enumerate(nums):
print(f'num: {num} \t rank: {ranks[idx] + 1}')
리스트에 같은 값 반복할 때: for 구문을 리스트 안에 넣기!
ranks = [0 for i in range(20)] : '0' 값 20번 반복 됨
절댓값 함수: abs(n)
<버블정렬>
: 처음부터 끝까지 인접하는 인덱스의 값을 순차적으로 비교하면서 큰 숫자를 가장 끝으로 옮기는 알고리즘
ex
nums = [10,2,7,21,0]
print(f'not sorted nums: {nums}')
length = len(nums) - 1
for i in range(length):
for j in range(length - 1):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print(f'sorted nums: {nums}')
리스트 내 값 2개의 자리를 서로 바꾸는 방법
nums[j], nums[j+1] = nums[j+1], nums[j]
깊은복사, 얉은복사
: 기존에 있는 원본을 유지하면서 새로운 데이터를 받고 싶을 경우엔 깊은 복사를 하면 되고, 원본으로 작업을 하고 싶을 경우엔 얉은복사를 해야 함
import copy
copy.deepcopy(리스트명) -> 이렇게 하면 원본 훼손하지 않고 실행 O
<삽입정렬>
: 정렬되어 있는 자료 배열과 비교해서 정렬 위치를 찾는다.
ex.
nums = [5,10,2,1,0]
for i1 in range(1, len(nums)):
i2 = i1 - 1
cNum = nums[i1]
while nums[i2] > cNum and i2 == 0:
nums[i2 + 1] = nums[i2]
i2 -= 1
nums[i2 + 1] = cNum
print(f'nums: {nums}')
<선택정렬>
: 주어진 리스트 중에 최소값을 찾아, 그 값을 맨 앞에 위치한 값과 교체하는 방식으로 자료를 정렬하는 알고리즘
ex
nums = [4, 2, 5, 1, 3]
print(nums)
for i in range(len(nums)-1):
minIdx = i
for j in range(i+1, len(nums)):
if nums[minIdx] > nums[j]:
minIdx = j
ns[i], ns[minIdx] = ns.[minIdx], ns[i]
print(nums)
<최댓값>
: 자료구조에서 가장 큰 값을 찾는다.
class MaxAlgorithm:
def init(self, ns):
self.nums = ns
self.maxNum = 0
def getMaxNum(self):
self.maxNum = self.nums[0]
for n in self.nums:
if self.maxNum < n:
self.maxNum = n
return self.maxNum
ma = MaxAlgorithm([-2,2,-4,5,7,10,0,8,20,-11])
maxNum = ma.getMaxNum()
print(f'maxNum: {maxNum}')
<최솟값>
: 자료구조에서 가장 작은 값을 찾는다.
class MinAlgorithm:
def init(self, ns):
self.nums = ns
self.minNum = 0
def getMinNum(self):
self.minNum = self.nums[0]
for n in self.nums:
if self.minNum > n:
self.minNum = n
return self.minNum
ma = MinAlgorithm([-2,-4,5,7,10,0,8,20,-11])
minNum = ma.getMinNum()
print(f'minNum: {minNum}')
<최빈값>
: 데이터에서 빈도수가 가장 많은 데이터
class MaxAlgorithm:
def init(self, ns):
self.nums = ns
self.maxNum = 0
self.maxNumIdx = 0
def setMaxIdxAndNum(self):
self.maxNum = self.nums[0]
self.maxNumIdx = 0
for i, n in enumerate(self.nums):
if self.maxNum < n:
self.maxNum = n
self.maxNumIdx = i
def getMaxNum(self):
return self.maxNum
def getMaxNumIdx(self):
return self.maxNumIdx
nums = [1,3,7,6,7,7,7,12,12,17]
maxAlo = MaxAlgorithm(nums)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
print(f'maxNum: {maxNum}')
indexes = [0 for i in range(maxNum + 1)]
print(f'indexes: {indexes}')
print(f'indexes length: {len(indexes)}')
for n in nums:
indexes[n] = indexes[n] + 1
print(f'indexes: {indexes}')
maxAlo = MaxAlgorithm(indexes)
maxAlo.setMaxIdxAndNum()
maxNum = maxAlo.getMaxNum()
maxNumIdx = maxAlo.getMaxNumIdx()
print(f'maxNum: {maxNum}')
print(f'maxNumIdx: {maxNumIdx}')
4.24
오늘 수강한 부분: 알고리즘 5~7
<근삿값>
: 특정 값(참값)에 가장 가까운 값
ex
import random
nums = random.sample(range(0,50), 20)
print(f'nums: {nums}')
inputNum = int(input('input number: '))
print(f'inputNum: {inputNum}')
nearNum = 0
minNum = 50
for n in nums:
absNum = abs(n - inputNum)
if absNum < minNum:
minNum = absNum
nearNum = n
print(f'nearNum: {nearNum}')
<평균>
: 여러 수나 양의 중간값을 갖는 수
ex. 랜덤 10개의 수 평균 구하기
import random
nums = random.sample(range(0,100), 10)
print(f'nums: {nums}')
total = 0
for n in nums:
total += n
average = total / len(nums)
print(f'average: {average}')
<재귀>
: 나 자신을 다시 호출하는 것
ex. 재귀를 이용해 하나씩 줄어드는 만들기
def recusion(num):
if num > 0:
print(''* num)
return recusion(num - 1)
else:
return 1
recusion(10)
ex. 유클리드 호제법을 이용해 최대공약수 구하기
def gcd(n1, n2)
if n1 % n2 == 0:
return n2
else:
return gcd(n2, n1 % n2)
print(f'gcd(n1, n2): {gcd(n1, n2)}')
<하노이의 탑>
: 퍼즐 게임의 일종, 세 개의 기둥을 이용해 원판을 다른 기둥으로 옮기면 됨
원판개수, 출발 기둥, 도착 기둥, 경유 기둥
def moveDisc(discCnt, fromBar, toBar, viaBar):
if discCnt == 1:
print((f'{discCnt}disc를 {fromBar}에서 {toBar}(으)로 이동!'))
else:
moveDisc(discCnt-1, fromBar, viaBar, toBar)
print((f'{discCnt}disc를 {fromBar}에서 {toBar}(으)로 이동!'))
moveDisc(discCnt - 1, fromBar, viaBar, toBar)
moveDisc(3, 1, 3, 2)
<병합정렬> 너무 어려움 ㅠ_ㅠ
: 자료구조를 분할하고 각각의 분할된 자료구조를 정렬한 후 다시 병합하여 정렬함
ex.
def mSort(ns):
if len(ns) < 2:
return ns
midIdx = len(ns) // 2
leftNums = mSort(ns[:midIdx])
rightNums = mSort(ns[midIdx:])
mergeNums = []
leftIdx = 0; rightIdx = 0
while leftIdx < len(leftNums) and rightIdx < len(rightNums):
if leftNums[leftIdx] < rightNums[rightIdx]:
mergeNums.append(leftNums[leftIdx])
leftIdx += 1
else:
mergeNums.append(rightNums[rightIdx])
rightIdx += 1
mergeNums += leftNums[leftIdx:]
mergeNums += rightNums[rightIdx:]
return mergeNums
nums = [8,1,4,3,2,5,10,6]
print(f'mSort(nums): {mSort(nums)}')
<퀵 정렬>
: 기준 값보다 작은 값과 큰 값으로 분리한 후 다시 합친다.
ex.
def qSort(ns):
if len(ns) < 2:
return ns
midIdx = len(ns) // 2
midVal = ns[midIdx]
smallNums = []; sameNums = []; bigNums = []
for n in ns:
if n < midVal:
smallNums.append(n)
elif n == midVal:
sameNums.append(n)
else:
bigNums.append(n)
return qSort(smallNums) + sameNums + qSort(bigNums)
nums = [8,1,4,3,2,5,4,10,6,8]
qSort(nums)
print(f'qSort(nums): {qSort(nums)}')
내림차순까지 만들 경우: asc = True 이용
def qSort(ns, acs = True):
if len(ns) < 2:
return ns
midIdx = len(ns) // 2
midVal = ns[midIdx]
smallNums = []; sameNums = []; bigNums = []
for n in ns:
if n < midVal:
smallNums.append(n)
elif n == midVal:
sameNums.append(n)
else:
bigNums.append(n)
if asc:
return qSort(smallNums, asc=asc) + sameNums + qSort(bigNums, asc=asc)
else:
return qSort(bigNums, asc=asc) + sameNums + qSort(smallNums,asc=asc)
nums = [8,1,4,3,2,5,4,10,6,8]
qSort(nums)
print(f'qSort(nums): {qSort(nums)}')
4.26
-conda 버전확인, 주피터 설치 다 안되서 그냥 컴퓨터 초기화 시켜서 아무것두 못했다..ㅠ
4.28
-오늘 수강한 분량: 파이썬 프로그래밍 테스트
4.29
-오늘 수강한 분량: 오티1~2, CCTV1~2
<콘다 환경 생성>
conda create -n ds_study python=3.12
ds_study 라는 환경 생성, 뒤에 python은 파이썬 버전을 의미
강의에서는 3.8로 했으나, 나는 현재 파이썬 3.12를 사용하고 있어 3.12로 진행
강의 중 모든 실습은 ds_study를 켜놓고 진행!!!
<콘다 환경 실행>
conda activate ds_study
기본 base 환경에서 ds_study 환경으로 변경
<콘다 환경 실행 종료>
conda deactivate
<콘다 환경 리스트 확인>
conda env list
<콘다 환경 삭제>
conda env remove -n ds_study
<주피터 노트북 실행>
아나콘다에서 jupyter notebook 치면 크롬에서 자동으로 켜짐
new > notebook 누르고 파일에 python3 선택
강의에서는 python3가 첫 화면에서부터 나와서 내가 뭘 잘못 설치한줄 알고 처음부터 다시했다.. ㅠ 업데이트 해주세요... 헷갈려요..
<주피터 노트북 한글설정>
import matplotlib.pyplot as plt
%matplotlib inline
plt.title("데이터사이언스")
맨 처음 이걸 실행하면 오류가 뜰텐데, 한글설정이 되어있지 않아 뜨는 오류
from matplotlib import font_manager
(한줄 띄고)
f_path = "C:\Windows\Fonts\malgun.ttf"
font_manager.FontProperties(fname=f_path).get_name()
실행하면 설정할 수 있는 폰트가 뜬다. 내 컴퓨터는 'Malgun Gothic' 이 떴다.
cf. 윈도우는 역슬래시 두 번 써야 오류가 나지 않음!!
from matplotlib import rc
rc("font", family="Malgun Gothic")
이렇게 설정 폰트를 넣어주고 실행시킨 다음 맨 처음 코드 실행하면 정상 작동 함!
import matplotlib.pyplot as plt
%matplotlib inline
plt.title("데이터사이언스")
from matplotlib import rc
rc("font", family="Malgun Gothic")
앞으로 꼭 이걸 실행한 후 작성하기! 주피터 노트북에도 저장해두기
cf. 나갈 때 file > close and holt 로 나가라는데, 나는 없어서 그냥 close and shut down notebook 으로 나갈 생각이다.... 맞는지는 모르겠다 ㅠ.ㅠ
<비주얼 스튜디오 코드>
extension -> python 검색 후 맨 위에 있는 것 다운로드
-주피터 노트북 설정하는 법
ctrl + shift + p 누르고 select interpreter > python ds_study conda 누르기!
근데 나는 이렇게 해도 주피터 노트북이라고 화면에 안뜨던데... 실행 되니까 맞겠지..? ㅠ