[제로베이스] 4주차_알고리즘(문풀) 01

해오름·2023년 2월 23일
0

[zb]

목록 보기
4/18

📌2/23 영상강의 6_031 ~ 6_034 + 6_044
🖥️숫자로 이루어진 리스트에서 입력한 숫자를 검색하는 모듈을 다음 요건에 따라 만들어보자

#모듈
def searchNumberAlgirithm(ns, sn):


    searchResultIdx = -1
    print(f'Numbers : {ns}')
    print(f'Search Number : {sn}')

    n = 0
    while True:

        if n ==len(ns):
            print('Search Fale!')
            break

        if ns[n] == sn:
            searchResultIdx = n
            print('Search SUCCESS!')
            print(f'Search result INDEX : {searchResultIdx}')
            break

        n += 1

    return  searchResultIdx
    
#실행부
import random as rd
import lineMod as lm


if __name__== '__main__':

    rNums = rd.sample(range(1,21),10)
    searchNum = int(input('찾으려는 숫자 입력:'))

    resultIdx = lm.searchNumberAlgirithm(rNums,searchNum)
    if resultIdx == -1:
        print('No results found')
        print(f'search result index : {resultIdx}')
    else:
        print('>>> Search Result <<<')
        print(f'search result index : {resultIdx}')
        print(f'search result number : {rNums[resultIdx]}')

  • while문을 사용하여 찾는 값이 있을때와 리스트의 끝까지 갔는데 없을때로 반복문을 빠져나오게 설정한다. 찾는 값이 없을때 -1을 출력하기 위해 searchResultIdx 의 처음 값을 -1로 정한다.

🖥️숫자로 이루어진 리스트에서 입력한 숫자를 검색하는 모듈을 다음 요건에 따라 만들어보자

#모듈
def binaryALgorithm(ns,sn):


    secrchIdx = -1


    staIdx = 0
    endIdx = len(ns)-1

    midIdx = len(ns) // 2
    midVal = ns[midIdx]
    print(f'staIdx : {staIdx}, endIdx :{endIdx}')
    print(f'midIdx : {midIdx}, midVal :{midVal}')


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

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

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


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

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

        elif sn == midVal:
            secrchIdx = midIdx
            break

    return secrchIdx
    
#실행부

import binaryMod as bm

if __name__ == '__main__':
    nums = [1, 2, 4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 20, 21, 23, 24 ,27, 28]
    searchData = int(input('input search number : '))

    resultIdx = bm.binaryALgorithm(nums,searchData)
    print(nums)
    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:{nums[resultIdx]}')
  • 내가 찾는 숫자가 midVal이 되면 성공!
  • 기존 리스트의 끝 값이 내가 찾는 숫자와 같을 경우도 넣어준다 (연산이 빨리끝나서 좋은건가봄)
  • 찾는 숫자가 리스트에 없을때 무한반복에 빠지지 않게 하는 조건도 있어야한다.

🖥️알파벳 문자들과 정수들에 대한 순위를 알고리즘을 이용해 만들어보자 알파벳은 아스키코드 값을 이용한다.

#모듈
def rankAlgorithm(ns):
    ranks = [0 for i in range(len(ns))]

    for idx, n1 in enumerate(ns):
        for n2 in ns:
            if n1 < n2:
                ranks[idx] += 1
    print(f'datas : {ns}')
    print(f'ascIIDatas : {ranks}')

    for i ,n in enumerate(ns):        #보기좋게 랭크1부터 표시되도록 +1해줌
        print(f'data:{n} \trank: {ranks[i]+1}')


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


    return result
    
 #실행부
 
 import rankMod as rm

datas = [32, 'a', 'z', 45, 'G', 39, 50, 'T', 't', 22, 31, 55, 's', 63, 59, 'E']

ascIIDates = []
for data in datas:
    if type(data) == str:
        data = ord(data)
        ascIIDates.append(data)

    else:
        ascIIDates.append(data)

sotedRank = rm.rankAlgorithm(ascIIDates)
print(sotedRank)

🖥️전체 학생의 시험 점수에 대한 평균과 최솟값을 구하고 , 평균과 최솟값의 편차를 구하는 프로그램을 최솟값 알고리즘을 이용해서 만들어보자

#모듈
def getAvg(ns):

    total = 0
    for n in ns:
        total += n

    return total / len(ns)

def getMin(ns):

    minN = ns[0]
    for n in ns:
        if minN > n:
            minN = n

    return minN

def getdeviation(n1,n2):
    return round(abs(n1-n2),2)

def getMaxorMin(ns,maxFlag=True):

    resultN = ns[0]
    for n in ns:
        if maxFlag:
            if resultN < n:
                resultN = n
        else:
            if resultN > n:
                resultN = n

    return resultN
    
#실행부
import mod

scores = [100, 64, 94, 66, 75, 58, 99, 76, 96, 74,
          54, 73, 88, 70, 68, 50, 95, 89, 69 ,98]

scores_avg = mod.getAvg(scores)
maxOrMin = mod.getMaxorMin(scores,maxFlag=True)
deviation = mod.getdeviation(scores_avg,maxOrMin)

print(f'scores_avg :{scores_avg}')
print(f'maxOrMin :{maxOrMin}')
print(f'deviation :{deviation}')
  • 최댓값, 최솟값 한번에 구하는 함수 만들기 -> maxflag=True를 인수로 함수에 던진다. 함수에서는 변수로 T/F를 구분해서 받고 T/F일때와 아닐때의 조건식을 나누어 전개한다 (이전 asc=True 사용법과 동일)

마무리
알고리즘 문제풀이 순서가 pdf 강의자료와 맞질 않아서 약간 혼란하다
오늘 모각코에서 이해가 안됐던 부분을 얘기했는데 다들 함께 고민해주고 설명해주셔서 넘 감사했다. 읭 스러운 질문일까봐 물어봐도 괜찮을지 조금 망설였었는데 비전공자의 머릿속에 하나라도 더 넣어주시려고 힘써주시는 모습이 정말.. 갬동..흑흑 고마워요 나의 동료덜
그리고 아직 코딩테스트를 풀다 말다 하고있는데 공부만 쭉 할때보다 집중력이 떨어진다. 테스트는 주말에 바짝 하는걸루! EDA도 해야하는데 !

profile
study note

0개의 댓글