20220926 모각코 1회 피보나치 수열, 재귀, 선형탐색, 이진탐색, PyQt5

2022. 9. 27. 14:55카테고리 없음

소프트웨어프로젝트2 수업 복습.

빠르게 복습 가보자고.

근데 참고로 안돌려보고 바로 올리는거라 오타가 있을지도. 안돌아갈지도.

임시저장 갈기면서 열심히 타이핑 해보겠음~~

검색어 걸려서 방문자수 1000 돌파하면 좋겟다

 

[피보나치 수열 Fibonacci Sequence O(n)]

def Fibo(n):
    pp = 0
    p = 1
    result = 0

    for i in range(2, n+1):
        result = p + pp
        pp = p
        p = result
    
    return result
    
n = int(input('n: '))
print("Fibo(%d) : %d" %(n, Fibo(n)))

원래 이걸 재귀로 코드 짰었음. 그건 O(n^2) 이라 돌아가는데 시간 오래걸림.

하지만 이건? O(n)임.

 

[피보나치 수열 재귀적 구현 Recursive Fibonacci Sequence O(n^2)]

def rFibo(n):
    if n == 0:
        return 0
    elif n==1:
        return 1
    else:
        return rFibo(n-1) + fibo(n+2)
        
n = int(input('n: '))
print("Fibo(%d) : %d" %(n, rFibo(n)))

짠 이게 문제의 코드. 재귀로 짬.

간단하게 생겼는데 n이 커질수록 함수를 계속 불러서 n^2 이나 걸림!!!

 

[선형 탐색 Linear Search]

import random

def makeList(n):
    list = []

    for i in range(n):
        list.append(random.randint(1, 100))
    
    return list

def linearSearch(list, key):
    size = len(list)

    for i in range(size):
        if(list[i] == key):
            return i

    return -1

n = int(input('n: '))
list = makeList(n)
print(list)

key = int(input('key: '))
idx = linearSearch(list, key)
if(idx == -1):
    print("No Exist")
else:
    print("In %d index" %idx)

일단 랜덤으로 숫자 1~100 사이의 숫자가 리스트에 들어감 100이하임 100미만이 아님!!!

아니 파이썬 왜이럼? range랑은 또 다르잔아 좀 통일해라 please 근데 다 이유가 잇겟지?ㅎㅎ;;

 

그리고 리스트안을 인덱스 0부터 돌면서 키값이랑 같은게 나오면 인덱스값 리턴!

바로 빠져나옴! 아니면 -1 리턴

 

근데 수업 들을때 저렇게 짜면 if 결과랑 상관없이 return -1 이 무조건 걸리는줄.. 이제 최지원한테 물어보고 올거임 ㄱㄷ

???: 맞다.

고 함 키값이랑 같은거 찾으면 for문 밖으로 빠져나간다고 함~~

 

 

[이진 탐색 Binary Search]

def makeList(n):
    list = []

    for i in range(n):
        list.append(random.randint(1, 100))
    
    return list

def binarySearch(list, key):
    low = 0
    high = len(list) - 1
    while(low <= high):
        mid = (low + high) // 2
        if(list[mid] == key):
            return mid
        elif(list[mid] < key):
            low = mid + 1
        else:
            high = mid - 1
    
    return -1


n = int(input('n: '))
list = makeList(n)
list = sorted(list)
print(list)

key = int(input('key: '))
idx = binarySearch(list, key)
if(idx == -1):
    print("No Exist")
else:
    print("In %d index" %idx)

일단 위에랑 makeList 함수 부분은 똑같음.

하지만? 혹시라도 만에 하나 나의 블로그를 보고 누군가가 코드를 참고한다면???

이 부분만 보고 복붙할 수도 있으니 친절하게 다 적어줌

어쨌든 이진탐색은 사전처럼 반씩 쪼개고 아닌부분 쳐내고 반 쪼개고 반 쪼개다가 앗 찾았다~~!~! 하는 것

그래서 low랑 high라는 변수를 쓴다 두개 평균내서 중간부분을 찾는거임

설명은 귀찮으니 여기까지만 적어야징.

 

[이진 탐색 Recursive Binary Search]

def recurBinarySearch(list, low, high, key):

    if(low <= high):
        mid = (low + high) // 2
        if(list[mid] == key):
            return mid
        elif(list[mid] < key):
            return recurBinarySearch(list, mid+1, high ,key)
        else:
            return recurBinarySearch(list, low, mid-1, key)
    
    return -1

이번에도 makeList 필요한데 걍 내가 보기 힘들어서 뺌.

이건~ 재귀적으로 구현한건데 사실 교수님이 재귀로 구현해보세요 햇을때 땀 삐질흘리면서 가만히잇었음

재귀 넘 어렵잔아???ㅠ 근데 듣고나면 쉬움

if문 안에서 low 와 high의 값만 바뀌면 되니까

return 자기자신(low값 바꾸기)

return 자기자신(high값 바꾸기)

이렇게 해주면 되겟음

 

아 참고로

idx = recurBinarySearch(list, 0, n-1, key)

복붙할때  idx는 이렇게 써줘야된다. argument(인수) 가 두개 더 들어감!!

이거 인수 맞지 지원아?? 맞대요 여러분.

 

[PyQt5]

import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
# label = QLabel("Hello, world")
# label.show()
print(sys.argv)
label = QPushButton("Quit")
label.show()
app.exec_()

이건~~ 창이 뜨는 코드ㅎ

PyQt5

근데 잘 모름 교수님 설명할때 나혼자만 창이 안떠서 교수님 설명 못들엇거든

근데 개작아;;서 뜬줄도 모름 그래서 엥 내 코드 틀렸나??? 하면서 보는데 코딱지만한 화면 발견~⭐️

그래서 이게 뭔데?? 보시면 님들이 설명좀요..

 

[PyQt5??인가]

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("SWP2")
        self.setGeometry(300, 300, 300, 400)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

이건 창을 예쁘게 키운 코드임.

사실 잘 모르는데 아무튼 그런거임.

 

[이건 먼 코드지?]

class Parent:
    house = "yong-san"
    def __init__(self):
        self.money = 10000 # 인스턴스 변수

class Child1(Parent):
    def __init__(self):
        super().__init__()
        pass

class Child2(Parent):
    def __init__(self):
        pass

child1 = Child1()
child2 = Child2()

print('Child1', dir(child1))
print('Child2', dir(child2))

[실행 결과]

Child1 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'house', 'money']
Child2 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'house']

이게 뭐지?? 잘모르겟음... 근데 이렇게 블로그 성의없이 써도 댐?

[Person 클래스]

class Person:
    def __init__(self, name, job, pay):
        self.name = name
        self.job = job
        self.pay = pay
>>> from 파일명.py import Person
>>> p = Person('James', 'Developer', 100)

이것도 내가 해맴 근데 교수님이 from person import Person 이길래 따라쳣는데 안되는거임

근데 person 이 person.py..... 파일명이엇던거임

제발 그런건 설명해주시라구요 교수님 3학년 울어.

 

[Person 클래스 default값 넣어주기]

class Person:
    def __init__(self, name, job = None, pay = 0):
        self.name = name
        self.job = job
        self.pay = pay

if __name__ == '__main__': # 실행 주체가 ~~
    bob = Person('Bob Smith')
    sue = Person('Sue Jones', job='dev', pay=100000)
    print(bob.name, bob.pay)
    print(sue.name, sue.pay)
else:
    print("hello")

저 이 코드는 대체 머죠?..

if __name__ == '__main__':

 

해당 모듈이 임포트된 경우가 아니라 인터프리터에서 직접 실행된 경우에만,

if문 이하의 코드를 돌리라는 명령입니다.

 

라고 멋진 블로거님이 말씀해주심!!~

굿

 

class Person:
    def __init__(self, name, job = None, pay = 0):
        self.name = name
        self.job = job
        self.pay = pay
    def lastName(self):
        return self.name.split()[-1]
    def giveRaise(self, percent):
        self.pay = int(self.pay * (1 + percent))

if __name__=='__main__':
    bob = Person('Bob Smith')
    sue = Person('Sue Jones', job='dev', pay=1000000)
    print(bob)
    print(sue)
    print(bob.lastName(), sue.lastName())
    sue.giveRaise(1) # 하나만 넣어준다!
    print(sue.pay)

음~~~~~~~~~~~~~

머지?
머지는 합병입니다.

잘모르겟어요. 교수님제송해요.

<__main__.Person object at 0x7fa7f004bdc0>
<__main__.Person object at 0x7fa7f004bd60>
Smith Jones
2000000

이렇게 나옴ㅎ

 

아무튼 이렇게 1주차 모각코를 완료해보았어요.

블로그 이렇게 하는거 맞나요?