datas = [3, 2, 5, 7, 9, 1, 0, 8, 6, 4] print('datas: {}'.format(datas)) print('datas length: {}'.format(len(datas)))searchData = int(input('찾으려는 숫자 입력: ')) searchResultIdx = -1n = 0 while True: if n == len(datas): searchResultIdx = -1 breakelif datas[n] == searchData: searchResultIdx = n breakn += 1print('searchResultIdx: {}'.format(searchResultIdx))
datas = [3, 2, 5, 7, 9, 1, 0, 8, 6, 4] print('datas: {}'.format(datas)) print('datas length: {}'.format(len(datas)))searchData = int(input('찾으려는 숫자 입력: ')) searchResultIdx = -1datas.append(searchData)n = 0 while True: if datas[n] == searchData: if n != len(datas) - 1: searchResultIdx = n breakn += 1print('datas: {}'.format(datas)) print('datas length: {}'.format(len(datas))) print('searchResultIdx: {}'.format(searchResultIdx))
nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9] print('nums: {}'.format(nums)) print('nums length: {}'.format(len(nums)))searchData = int(input('input search number: ')) searchResultIdx = -1nums.append(searchData)n = 0 while True: if nums[n] == searchData: if n != len(nums) - 1: searchResultIdx = n breakn += 1print('nums: {}'.format(nums)) print('nums length: {}'.format(len(nums))) print('searchResultIdx: {}'.format(searchResultIdx))if searchResultIdx < 0: print('not search index') else: print('search index: {}'.format(searchResultIdx))
nums = [4, 7, 10, 2, 4, 7, 0, 2, 7, 3, 9] print('nums: {}'.format(nums)) print('nums length: {}'.format(len(nums)))searchData = int(input('input search number: ')) searchResultIdxs = []nums.append(searchData)n = 0 while True: if nums[n] == searchData: if n != len(nums) - 1: searchResultIdxs.append(n) else: breakn += 1print('nums: {}'.format(nums)) print('nums length: {}'.format(len(nums))) print('searchResultIdxs: {}'.format(searchResultIdxs)) print('searchResultCnts: {}'.format(len(searchResultIdxs)))

datas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] print('datas: {}'.format(datas)) print('datas length: {}'.format(len(datas)))searchData = int(input('search data: ')) searchResultIdx = -1staIdx = 0 endIdx = len(datas) - 1 midIdx = (staIdx + endIdx) // 2 midVal = datas[midIdx]while searchData <= datas[len(datas) - 1] and searchData >= datas[0]: if searchData == datas[len(datas) - 1]: searchResultIdx = len(datas) - 1 breakif searchData > midVal: staIdx = midIdx midIdx = (staIdx + endIdx) // 2 midVal = datas[midIdx] print('midIdx: {}'.format(midIdx)) print('midVal: {}'.format(midVal))elif searchData < midVal: endIdx = midIdx midIdx = (staIdx + endIdx) // 2 midVal = datas[midIdx] print('midIdx: {}'.format(midIdx)) print('midVal: {}'.format(midVal))elif searchData == midVal: searchResultIdx = midIdx breakprint('searchResultIdx: [{}]'.format(searchResultIdx))
nums = [4, 10, 22, 5, 0, 17, 7, 11, 9, 61, 88] print('nums: {}'.format(nums))nums.sort() print('nums: {}'.format(nums))searchData = int(input('search number: ')) searchResultIdx = -1staIdx = 0 endIdx = len(nums) - 1 midIdx = (staIdx + endIdx) // 2 midVal = nums[midIdx]while searchData <= nums[len(nums) - 1] and searchData >= nums[0]: if searchData == nums[len(nums) - 1]: searchResultIdx = len(nums) - 1 breakif searchData > midVal: staIdx = midIdx midIdx = (staIdx + endIdx) // 2 midVal = nums[midIdx]elif searchData < midVal: endIdx = midIdx midIdx = (staIdx + endIdx) // 2 midVal = nums[midIdx]elif searchData == midVal: searchResultIdx = midIdx breakprint('searchResultIdx: {}'.format(searchResultIdx))
import randomnums = random.sample(range(50, 101), 20) ranks = [0 for i in range(20)]print('nums: {}'.format(nums)) print('ranks: {}'.format(ranks))for idx, num1 in enumerate(nums): for num2 in nums: if num1 < num2: ranks[idx] += 1print('nums: {}'.format(nums)) print('ranks: {}'.format(ranks))for idx, num in enumerate(nums): print('num: {} \t rank: {}'.format(num, ranks[idx] + 1))
rankMod 모듈
class RankDeviation: def __init__(self, mss, ess): self.midStuScos = mss self.endStuScos = ess self.midRanks = [0 for i in range(len(mss))] self.endRanks = [0 for i in range(len(mss))] self.rankDeviation = [0 for i in range(len(mss))]def setRank(self, ss, rs): for idx, sco1 in enumerate(ss): for sco2 in ss: if sco1 < sco2: rs[idx] += 1def setMidRank(self): self.setRank(self.midStuScos, self.midRanks) def getMidRank(self): return self.midRanksdef setEndRank(self): self.setRank(self.endStuScos, self.endRanks) def getEndRank(self): return self.endRanksdef printRankDeviation(self): for idx, mRank in enumerate(self.midRanks): deviation = mRank - self.endRanks[idx]if deviation > 0: deviation = '↑' + str(abs(deviation)) elif deviation < 0: deviation = '↓' + str(abs(deviation)) else: deviation = '=' + str(abs(deviation))print('mid_rank: {} \t end_rank: {} \t Deviation: {}'.format(mRank, self.endRanks[idx], deviation))
rankEx.py
import rankMod as rm import randommidStuScos = random.sample(range(50, 101), 20) endStuScos = random.sample(range(50, 101), 20)rd = rm.RankDeviation(midStuScos, endStuScos)rd.setMidRank() print('midStuScors: {}'.format(midStuScos)) print('mid_rank: {}'.format(rd.getMidRank()))rd.setEndRank() print('endStuScors: {}'.format(endStuScos)) print('end_rank: {}'.format(rd.getEndRank()))rd.printRankDeviation()

nums = [10, 2, 7, 21, 0] print('not sorted nums: {}'.format(nums))length = len(nums) - 1 for i in range(length): for j in range(length - i): if nums[j] > nums[j + 1]: nums[j], nums[j + 1] = nums[j + 1], nums[j]print(nums) print()print('sorted nums: {}'.format(nums))
sortMod 모듈
import copydef bubbleSort(ns, deepCopy=True):깊은 복사
if deepCopy: cns = copy.copy(ns)얕은 복사
else: cns = nslength = len(cns) - 1 for i in range(length): for j in range(length - i): if cns[j] > cns[j + 1]: cns[j], cns[j + 1] = cns[j + 1], cns[j]return cns
bubbleEx.py
import random as rd import sortMod as smstudents = []for i in range(20): students.append(rd.randint(170, 185))print('students: {}'.format(students))깊은 복사
sortedStudent = sm.bubbleSort(students, deepCopy=True)얕은 복사
sortedStudent = sm.bubbleSort(students, deepCopy=False)print('students: {}'.format(students)) print('sortedStudents: {}'.format(sortedStudent))

오름차순
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 -= 1nums[i2 + 1] = cNumprint('nums: {}'.format(nums))
내림차순
nums = [0, 5, 2, 10, 1]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 -= 1nums[i2 + 1] = cNumprint('nums: {}'.format(nums))
sortMod 모듈
class SortNumbers: def __init__(self, ns, asc=True): self.nums = ns self.isAsc = ascdef isAscending(self, flag): self.isAsc = flagdef setSort(self): for i1 in range(1, len(self.nums)): i2 = i1 - 1 cNum = self.nums[i1] if self.isAsc: while self.nums[i2] > cNum and i2 >= 0: self.nums[i2 + 1] = self.nums[i2] i2 -= 1 else: while self.nums[i2] < cNum and i2 >= 0: self.nums[i2 + 1] = self.nums[i2] i2 -= 1 self.nums[i2 + 1] = cNumdef getSortedNumbers(self): return self.numsdef getMinNumber(self): if self.isAsc: return self.nums[0] else: return self.nums[len(self.nums) - 1]def getMaxNumber(self): if self.isAsc: return self.nums[len(self.nums) - 1] else: return self.nums[0]
insertEx.py
import random import sortMod as smnums = random.sample(range(1, 1000), 100) print('not sorted numbers: {}'.format(nums))# 객체 생성
sn = sm.SortNumbers(nums)# 오름차순
sn.setSort() sortedNumbers = sn.getSortedNumbers() print('sortedNumbers by ASC: {}'.format(sortedNumbers))# 내림차순
sn.isAscending(False) sn.setSort() sortedNumbers = sn.getSortedNumbers() print('sortedNumbers by DESC: {}'.format(sortedNumbers))# 최대, 최솟값
print('min: {}'.format(sn.getMinNumber())) print('max: {}'.format(sn.getMaxNumber()))
nums = [4, 2, 5, 1, 3] print('nums: {}'.format(nums))for i in range(len(nums) - 1): minIdx = ifor j in range(i + 1, len(nums)): if nums[minIdx] > nums[j]: minIdx = jnums[i], nums[minIdx] = nums[minIdx], nums[i] print('nums: {}'.format(nums))print('fianl nums: {}'.format(nums))
sortMod 모듈
def sortNumber(ns, asc=True):if asc: for i in range(len(ns) - 1): minIdx = i for j in range(i + 1, len(ns)): if ns[minIdx] > ns[j]: minIdx = j ns[i], ns[minIdx] = ns[minIdx], ns[i]else: for i in range(len(ns) - 1): minIdx = i for j in range(i + 1, len(ns)): if ns[minIdx] < ns[j]: minIdx = j ns[i], ns[minIdx] = ns[minIdx], ns[i]return ns
selectionSortEx.py
import random import sortMod as sm import copyscores = random.sample(range(50, 100), 20)copy.deepcopy()로 원본을 훼손하지않고 가져올 수 있음
print('scores: {}'.format(scores)) result = sm.sortNumber(copy.deepcopy(scores)) print('result: {}'.format(result))print('scores: {}'.format(scores)) result = sm.sortNumber(copy.deepcopy(scores), asc=False) print('result: {}'.format(result))

class MaxAlgorithm: def __init__(self, ns): self.nums = ns self.maxNum = 0def getMaxNum(self): self.maxNum = self.nums[0]for n in self.nums: if self.maxNum < n: self.maxNum = nreturn self.maxNum속성 초기화
ma = MaxAlgorithm([-2, -4, 5, 7, 10, 0, 8, 20, -11])최댓값 반환
maxNum = ma.getMaxNum() print('maxNum: {}'.format(maxNum))
class MaxAlgorithm: def __init__(self, cs): self.chars = cs self.maxchar = 0def getMaxChar(self): self.maxChar = self.chars[0]# ord() -> 문자열을 아스키코드로 변환시켜줌
for c in self.chars: if ord(self.maxChar) < ord(c): self.maxChar = creturn self.maxCharchars = ['c', 'x', 'Q', 'A', 'e', 'P', 'p'] mc = MaxAlgorithm(chars) maxChar = mc.getMaxChar() print('maxChar: {}'.format(maxChar))

class MinAlgorithm: def __init__(self, ns): self.nums = ns self.minNum = 0def getMinNum(self): self.minNum = self.nums[0]for n in self.nums: if self.minNum > n: self.minNum = nreturn self.minNumma = MinAlgorithm([-2, -4, 5, 7, 10, 0, 8, 20, -11]) minNum = ma.getMinNum() print('minNum: {}'.format(minNum))
class MinAlgorithm: def __init__(self, cs): self.chars = cs self.minChar = 0def getMinChar(self): self.minChar = self.chars[0]for c in self.chars: if ord(self.minChar) > ord(c): self.minChar = creturn self.minCharma = MinAlgorithm(['c', 'x', 'Q', 'A', 'e', 'P', 'p']) minChar = ma.getMinChar() print('minChar: {}'.format(minChar))

class MaxAlgorithm: def __init__(self, ns): self.nums = ns self.maxNum = 0 self.maxNumIdx = 0def setMaxIndAndNum(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 = idef getMaxNum(self): return self.maxNumdef getMaxNumIdx(self): return self.maxNumIdxnums = [1, 3, 7, 6, 7, 7, 7, 12, 12, 17]maxAlo = MaxAlgorithm(nums) maxAlo.setMaxIndAndNum() maxNum = maxAlo.getMaxNum() print('maxNum: {}'.format(maxNum))indexes = [0 for i in range(maxNum + 1)] print('indexes: {}'.format(indexes)) print('indexes length: {}'.format(len(indexes)))for n in nums: indexes[n] = indexes[n] + 1 print('indexes: {}'.format(indexes))maxAlo = MaxAlgorithm(indexes) maxAlo.setMaxIndAndNum() maxNum = maxAlo.getMaxNum() maxNumIdx = maxAlo.getMaxNumIdx() print('maxNum: {}'.format(maxNum)) print('maxNumIdx: {}'.format(maxNumIdx))print('즉, {}의 빈도수가 {}로 가장 높다.'.format(maxNumIdx, maxNum))

maxScore.py
class MaxAlgorithm: def __init__(self, ns): self.nums = ns self.maxNum = 0 self.maxNumIdx = 0def setMaxNumIdxAndNum(self): self.maxNum = self.nums[0] self.maxNumIdx = 0for i, n in enumerate(self.nums): if self.maxNum < n: self.maxNum = n self.maxNumIdx = idef getMaxNum(self): return self.maxNumdef getMaxNumIdx(self): return self.maxNumIdx
modeEx.py
import random import maxScore as msscores = []for i in range(100): rn = random.randint(71, 100) if rn != 100: rn = rn - (rn % 5) scores.append(rn)print('scores: {}'.format(scores)) print('scores length: {}'.format(len(scores)))# 최댓값 알고리즘 maxAlo = ms.MaxAlgorithm(scores) maxAlo.setMaxNumIdxAndNum() maxNum = maxAlo.getMaxNum() print('maxNum: {}'.format(maxNum))# 인덱스 리스트 생성 indexes = [0 for i in range(maxNum + 1)] print('indexes: {}'.format(indexes)) print('indexes length: {}'.format(len(indexes)))# 인덱스 리스트에 빈도 저장 for n in scores: indexes[n] = indexes[n] + 1 print('indexes: {}'.format(indexes))n = 1 while True: maxAlo = ms.MaxAlgorithm(indexes) maxAlo.setMaxNumIdxAndNum() maxNum = maxAlo.getMaxNum() maxNumIdx = maxAlo.getMaxNumIdx()if maxNum == 0: break print('{}. {}빈도수: {}\t'.format(n, maxNumIdx, maxNum), end='') print('+' * maxNum) indexes[maxNumIdx] = 0 n += 1
import randomnums = random.sample(range(0, 50), 20) print('nums: {}'.format(nums))inputNum = int(input('input number: ')) print('inputNum: {}'.format(inputNum))nearNum = 0 minNum = 50for n in nums: absNum = abs(n - inputNum) # print('absNum: {}'.format(absNum))if absNum < minNum: minNum = absNum nearNum = nprint('nearNum: {}'.format(nearNum))

near 모듈
def getNearNum(an): baseScores = [95, 85, 75, 65, 55] nearNum = 0 minNum = 100for n in baseScores: absNum = abs(n - an) if absNum < minNum: minNum = absNum nearNum = nif nearNum == 95: return 'A' elif nearNum == 85: return 'B' elif nearNum == 75: return 'C' elif nearNum == 65: return 'D' elif nearNum <= 55: return 'F'
nearEx.py
import nearscores = []kor = int(input('input kor score: ')) scores.append(kor) eng = int(input('input eng score: ')) scores.append(eng) mat = int(input('input mat score: ')) scores.append(mat) sci = int(input('input sci score: ')) scores.append(sci) his = int(input('input his score: ')) scores.append(his)# 총점 totalScore = sum(scores) print('totalScore: {}'.format(totalScore))# 평균 avgScore = totalScore / len(scores) print('avgScore: {}'.format(avgScore))# 등급 grade = near.getNearNum(avgScore) print('grade: {}'.format(grade))
import randomnums = random.sample(range(0, 100), 10) print('nums: {}'.format(nums))total = 0 for n in nums: total += naverage = total / len(nums) print('average: {}'.format(round(average, 2)))
import randomnums = random.sample(range(0, 100), 30) print('nums: {}'.format(nums))total = 0 targetNums = [] for n in nums: if n >= 50 and n <= 90: total += n targetNums.append(n)average = total / len(targetNums) print('targetNums: {}'.format(targetNums)) print('average: {}'.format(round(average, 2)))
nums = [4, 5.12, 0, 5, 7.34, 9.1, 9, 3, 3.159, 1, 11, 12.789] print('nums: {}'.format(nums))targetNums = [] total = 0 for n in nums: if n - int(n) == 0: total += n targetNums.append(n)average = total / len(targetNums) print('targetNums: {}'.format(targetNums)) print('average: {}'.format(round(average, 2)))
nums = [4, 5.12, 0, 5, 7.34, 9.1, 9, 3, 3.159, 1, 11, 12.789] print('nums: {}'.format(nums))targetNums = [] total = 0 for n in nums: if n - int(n) != 0: total += n targetNums.append(n)average = total / len(targetNums) print('targetNums: {}'.format(targetNums)) print('average: {}'.format(round(average, 2)))

near 모듈
class Top5Players: def __init__(self, cs, ns): self.currentScores = cs self.newScore = nsdef setAlignScores(self): nearIdx = 0 nearScore = 0 minNum = 10.0for i, s in enumerate(self.currentScores): absNum = abs(self.newScore - s)if absNum < minNum: minNum = absNum nearIdx = i nearScore = sif self.newScore >= self.currentScores[nearIdx]: for i in range(len(self.currentScores) - 1, nearIdx, -1): self.currentScores[i] = self.currentScores[i - 1] self.currentScores[nearIdx] = self.newScoreelse: for i in range(len(self.currentScores) - 1, nearIdx + 1, -1): self.currentScores[i] = self.currentScores[i - 1] self.currentScores[nearIdx] = self.newScoredef getFinalTop5Scores(self): return self.currentScores
averageEx.py
import nearscores = (8.9, 7.6, 8.2, 9.1, 8.8, 8.1, 7.9, 9.4, 7.2, 8.7) top5PlayerScores = [9.12, 8.95, 8.12, 7.90, 7.88] print('top5PlayerScores: {}'.format(top5PlayerScores))total = 0 average = 0 for n in scores: total += naverage = round(total / len(scores), 2)print('total: {}'.format(total)) print('average: {}'.format(average))tp = near.Top5Players(top5PlayerScores, average) tp.setAlignScores() top5PlayerScores = tp.getFinalTop5Scores() print('top5PlayerScores: {}'.format(top5PlayerScores))

def recusion(num): if num > 0: print('*' * num) return recusion(num - 1) else: return 1recusion(10)
def factorial(num): if num > 0: return num * factorial(num - 1) else: return 1print('factorial(10): {}'.format(factorial(10)))

재귀
def gcd(n1, n2): if n1 % n2 == 0: return n2 else: return gcd(n2, n1 % n2)print('gcd(82, 32): {}'.format(gcd(82, 32))) print('gcd(96, 40): {}'.format(gcd(96, 40)))
반복문
def gcd(n1, n2): maxNum = 0 for i in range(1, (n1 + 1)): if n1 % i == 0 and n2 % i == 0: maxNum = ireturn maxNumprint('gcd(82, 32): {}'.format(gcd(82, 32))) print('gcd(82, 32): {}'.format(gcd(96, 40)))
퍼즐 게임의 일종으로 세 개의 기둥을 이용해서 원판을 다른 기둥으로 옮기면 되고, 제약 조건은 다음과 같다

하노이의 탑 직접 해보기
(실습) 파이썬을 이용해서 하노이의 탑 게임 진행 과정을 출력
# 원판 개수, 출발 기둥, 도착 기둥, 경유 기둥 def moveDisc(discCnt, fromBar, toBar, viaBar): if discCnt == 1: print(f'{discCnt}disc: {fromBar}에서 {toBar}(으)로 이동!')else: # (discCnt-1)개들을 경유 기둥으로 이동 moveDisc(discCnt-1, fromBar, viaBar, toBar)# discCnt를 목적 기둥으로 이동 print(f'{discCnt}disc: {fromBar}에서 {toBar}(으)로 이동!')# (discCnt-1)개들을 도착 기둥으로 이동 moveDisc(discCnt-1, viaBar, toBar, fromBar)moveDisc(3, 1, 3, 2)


def mSort(ns): if len(ns) < 2: return ns# 분할 단계 midIdx = len(ns) // 2 leftNums = mSort(ns[0:midIdx]) rightNums = mSort(ns[midIdx:len(ns)])# 병합 단계 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 += 1mergeNums = mergeNums + leftNums[leftIdx:] mergeNums = mergeNums + rightNums[rightIdx:] return mergeNumsnums = [8, 1, 4, 3, 2, 5, 10, 6] print('mergedNums: {}'.format(mSort(nums)))

sortMod.py
def mSort(ns, asc=True): if len(ns) < 2: return ns# 분할 단계 midIdx = len(ns) // 2 leftNums = mSort(ns[0:midIdx], asc=asc) rightNums = mSort(ns[midIdx:len(ns)], asc=asc)# 병합 단계 mergeNums = [] leftIdx = 0; rightIdx = 0 while leftIdx < len(leftNums) and rightIdx < len(rightNums):# 오름차순 if asc: if leftNums[leftIdx] < rightNums[rightIdx]: mergeNums.append(leftNums[leftIdx]) leftIdx += 1 else: mergeNums.append(rightNums[rightIdx]) rightIdx += 1# 내림차순 else: if leftNums[leftIdx] > rightNums[rightIdx]: mergeNums.append(leftNums[leftIdx]) leftIdx += 1 else: mergeNums.append(rightNums[rightIdx]) rightIdx += 1mergeNums = mergeNums + leftNums[leftIdx:] mergeNums = mergeNums + rightNums[rightIdx:] return mergeNums
mergeEx.py
import random as rd import sortMod as smrNums = rd.sample(range(1, 101), 10) print('not sorted rNums: {}'.format(rNums)) print('sorted rNums ASC: {}'.format(sm.mSort(rNums))) print('sorted rNums DESC: {}'.format(sm.mSort(rNums, asc=False)))

def qSort(ns): if len(ns) < 2: return nsmidIdx = 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] print('qSort(nums): {}'.format(qSort(nums)))

sortMod.py
def qSort(ns, asc=True): if len(ns) < 2: return nsmidIdx = 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)
quickEx.py
import random as rd import sortMod as smrNums = rd.sample(range(1, 100), 10) print('not sorted rNums: {}'.format(rNums)) print('sorted rNums ASC: {}'.format(sm.qSort(rNums))) print('sorted rNums DESC: {}'.format(sm.qSort(rNums, asc=False)))
병합 정렬과 퀵 정렬을 사용하여 난수나 이미 있는 수의 리스트를 정렬하는 방법을 배운 것이 가장 기억에 남는다
재귀 함수 처음 부분은 어렵지 않았지만 하노이의 탑에서 머리가 멈추는 느낌이 들었다 너무 헷갈리고 직접 그려보고 나서야 조금은 이해를 했다 아직 백퍼센트 이해하지는 못한 것 같다
하노이의 탑을 직접 게임을 해보며 이해하려고 노력중인데 아직도 어렵다
오늘은 하노이의 탑을 중심적으로 복습해야겠다
내일은 알고리즘 문제풀이를 할 예정이다