20. 알고리즘_문풀1~2

wonny_·2023년 7월 29일
0

자료구조&알고리즘

목록 보기
9/10
  • 선형검색
Q. 숫자로 이루어진 리스트에서 사용자가 입력한 숫자를 검색하는 모듈 제작

-검색 모듈은 선형 알고리즘을 이용
-리스트는 1=20까지 정수 중에서 난수 10개 이용
-검색 과정을 로그로 출력
-검색에 성공하면 해당 정수의 인덱스 출력, 검색결과 없다면 -1 출력 

<lineMod 모듈>

def searchNumberByLineAl(ns, sn):

    searchResultIdx = -1

    print(f'numbers: {ns}')
    print(f'search numbers: {sn}')

    n = 0
    while True:

       if n == len(ns):
           print('search Fail')
           break
       elif ns[n] == sn:
           searchResultIdx = n
           print('search success')
           print(f'search Result Idx: {searchResultIdx}')
           break

       n += 1
    return  searchResultIdx
__________________________________________________________
<실행문>

import lineMod
import random

if __name__ == '__main__':

   searchNumber =  int(input('찾으려는 숫자 입력: '))
   numbers = random.sample(range(1, 21), 10)

   resultIdx = lineMod.searchNumberByLineAl(numbers, searchNumber)
   if resultIdx == -1:
        print('No results found')
        print(f'search result index: {resultIdx}')

   else:
       print('>>>search results<<<')
       print(f'search result Index: {resultIdx}')
       print(f'search result number: {numbers[resultIdx]}')

  • 이진검색
Q. 숫자로 이루어진 리스트에서 사용자가 입력한 숫자 검색하는 모듈 
-검색모듈은 이진검색 알고리즘 이용
-리스트는 [1, 2, 4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 20, 21, 23, 24, 27, 23] 이용
-검색과정 로그 출력
-검색에 성공하면 인덱스 출력, 검색 결과 없으면 -1 출력

<binaryMod 모듈>

def searchNumberByBinaryAl(ns, sn):

    searchResultIdx = -1 

    startIdx = 0
    endIdx = len(ns) -1
    midIdx = (startIdx + endIdx) // 2
    midVal = ns[midIdx] 

    print(f'startIdx: {startIdx}, endIdx: {endIdx}')
    print(f'midIdx: {midIdx}, midVal: {midVal}')

    while sn >= ns[0] and sn <= ns[len(ns) -1]:

        if sn == ns[len(ns) -1]:
            searchResultIdx = len(ns) -1
            break

        if startIdx + 1 == endIdx: #★
            if ns[startIdx] != sn and ns[endIdx] != sn:
                break

        if startIdx + 1 == endIdx:
            if ns[startIdx] != sn and ns[endIdx] != sn:
               break

        if sn > midVal:
            startIdx = midIdx
            midIdx = (startIdx + endIdx) // 2
            midVal = ns[midIdx]
            print(f'+startIdx: {startIdx}. endIdx: {endIdx}')
            print(f'+midIdx: {midIdx}, midVal: {midVal}')

        elif sn < midVal:
            endIdx = midIdx
            midIdx = (startIdx + endIdx) // 2
            midVal = ns[midIdx]
            print(f'-startIdx: {startIdx}, endIdx: {endIdx}')
            print(f'-midIdx: {midIdx}, midVal: {midVal}')

        elif sn == midVal:
            searchResultIdx = midIdx
            break

   return searchResultIdx
_________________________________________________________       
 <실행문>
import binaryMod as ba

if __name__ == '__main__':

nums = [1, 2, 4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 20, 21, 23, 24, 27, 23]
searchNum = int(input('input search num:'))

resultIdx = ba.searchNumberByBinaryAl(nums, searchNum)
print(f'nums: {nums}')

if resultIdx == -1:
    print('no result Founded')
    print(f'search result Idx: {resultIdx}')
else:
    print('>>search result found<<')
    print(f'search result Idx: {resultIdx}')
    print(f'search result number: {nums[resultIdx]}')

  • 순위 알고리즘1
Q. 숫자로 이루어진 리스트에서 아이템의 순위를 출력하고 순위에 따라 아이템을 정렬하는 모듈. 리스트는 50-100 난수 20개 이용 

<rankMod 모듈>

def rank(ns):

    ranks = [0 for i in range(len(ns))] #0으로 초기화된 len(ns)개의 아이템

    for idx, n1 in enumerate(ns):
        for n2 in ns: #나와 모든 아이템을 비교하기위해 중첩
            if n1 < n2:
               ranks[idx] += 1

    print(f'nums: {ns}')
    print(f'rank: {ranks}')

    for i, n in enumerate(ns):
         print(f'num: {n} \t rank: {ranks[i] + 1}')

    sortedNums = [0 for n in range(len(ns))]
    for idx, rank in enumerate(ranks):
        sortedNums[rank] = ns[idx]

    return sortedNums   
________________________________________________________________________

<실행문>

import random
import rankMod as rm

if __name__ == '__main__':

nums = random.sample(range(50, 101), 20)
sNums = rm.rank(nums)
print(f'sNum: {sNums}')

  • 순위 알고리즘2
Q. 알파벳 문자들과 정수들에 대한 순위를 정하는 순위 알고리즘을 이용.(단, 알파벳은 아스키코드 값을 이용) 
datas = [32, 'a', 'z', 45, 'G', 39, 50, 'T', 't', 22, 31, 55, 's', 63, 59, 'E']
print(f'datas: {datas}')

ascIIdatas = []
for data in datas:
    if str(data).isalpha():
         ascIIdatas.append(ord(data))
         continue

    ascIIdatas.append(data)

print(f'ascIIdatas: {ascIIdatas}')

ranks = [0 for i in range(len(ascIIdatas))]
print(f'ranks before: {ranks}')

for idx, data1 in enumerate(ascIIdatas):
    for data2 in ascIIdatas:
        if data1 < data2:
           ranks[idx] += 1

print(f'ranks after: {ranks}')

for i, d in enumerate(datas):
     print(f'data: {d:>2} \t ranke: {ranks[i] + 1}')

  • 버블정렬 알고리즘
Q. 숫자로 이루어진 리스트를 버블정렬 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈(단, 정렬하는 과정도 출력) 

<bubbleMod 모듈>

import copy

def sortedBubbleAl(ns, asc=True):

    c_ns = copy.copy(ns)

    length = len(c_ns) -1
    for i in range(length):
        for j in range(length -1):

            if asc:
                if c_ns[j] > c_ns[j+1]:
                    c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]

            else:
                if c_ns[j] < c_ns[j+1]:
                    c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]

            print(f'ns: {c_ns}')
        print()
     return c_ns
____________________________________________________________
   
 <실행문>
   
import random
import bubbleMod

if __name__ == '__main__':

   nums = random.sample(range(1, 21), 10)
   print(f'not sorted nums: {nums}')

   result = bubbleMod.sortedBubbleAl(nums)
   print(f'sorted nums by ASC: {result}')

   result = bubbleMod.sortedBubbleAl(nums, asc=False)
   print(f'sorted nums by DESC: {result}')

  • 삽입정렬 알고리즘
Q. 숫자로 이루어진 리스트를 삽입정력 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈(단, 정렬하는 과정도 출력) 

<insertMod 모듈>

import copy

def sortInsertAl(ns, asc=True):
    c_ns = copy.copy(ns)

    length = len(c_ns) -1
    for i in range(length):
        for j in range(length -1):

        if asc:
            if c_ns[j] > c_ns[j+1]:
                c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]
        else:
            if c_ns[j] < c_ns[j+1]:
                c_ns[j], c_ns[j+1] = c_ns[j+1], c_ns[j]

        print(f'c_ns: {c_ns}')
    print()
return c_ns
___________________________________________________________

<실행문>  

import random
import insertMod as im

if __name__ == '__main__':

nums = random.sample(range(1, 21), 10)
print(f'not sorted nums: {nums}')

result = im.sortInsertAl(nums)
print(f'sorted nums by ASC: {result}')

result = im.sortInsertAl(nums,asc=False)
print(f'sorted nums by DESC: {result}')

  • 선택정렬 알고리즘
Q. 숫자로 이루어진 리스트를 선택정렬 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈 (단, 정렬하는 과정도 출력) 
 
<insertMod 모듈>

import copy

def sortInsertAl(ns, asc=True):
    c_ns = copy.copy(ns)

    for i1 in range(1,len(c_ns)):
        i2 = i1 -1
        c_Num = c_ns[i1] 

        if asc: 
            while c_ns[i2] > c_Num and i2 >= 0:
                c_ns[i2+1] = c_ns[i2]
                i2 -= 1
        else: 
            while c_ns[i2] < c_Num and i2 >= 0:
                c_ns[i2+1] = c_ns[i2]
                i2 -= 1

        c_ns[i2 + 1] = c_Num
        print(f'c_ns: {c_ns}')

 return   
________________________________________________________
<실행문>

import random
import insertMod

if __name__ == '__main__':

nums = random.sample(range(1, 21), 10)

print(f'not sorted nums:\n {nums}')
result = insertMod.sortInsertAl(nums)
print(f'sorted nums by ASC: \n{result}')

print(f'not sorted nums:\n {nums}')
result = insertMod.sortInsertAl(nums, asc=False)
print(f'sorted nums by DESC:\n {result}')

  • 병합정렬 알고리즘
Q. 숫자로 이루어진 리스트를 병합정렬 알고리즘을 이용해서 오름차순과 내림차순으로 정렬하는 모듈(단, 정렬하는 과정도 출력) 

<insertMod 모듈>

import copy

def sortSelectAl(ns, asc=True):
    c_ns = copy.copy(ns)

    for i in range(len(c_ns)-1):
        minIdx = 1

        for j in range(i+1, len(c_ns)):

            if asc:
                if c_ns[minIdx] > c_ns[j]:
                   minIdx = j
           else:
               if c_ns[minIdx] < c_ns[j]:
                   minIdx = j

    c_ns[i], c_ns[minIdx] = c_ns[minIdx], c_ns[i]
    print(f'nums: {c_ns}')
 return c_ns
_____________________________________________________
<실행문>

import random
import selectMod as sm

if __name__ == '__main__':

   nums = random.sample(range(1, 21), 10)

   print(f'not sorted nums: {nums}')
   result = sm.sortSelectAl(nums)
   print(f'sorted nums by ASC: {result}')

   print(f'not sorted nums: {nums}')
   result = sm.sortSelectAl(nums, asc=False)
   print(f'sorted nums by DESC: {result}')

profile
파이팅

0개의 댓글