_won_
wonprogrammer
_won_
전체 방문자
오늘
어제
  • 분류 전체보기
    • woncoding
      • TIL
      • WIL
    • source Code
      • Python
      • Programmers
      • BAEKJOON

블로그 메뉴

  • 방명록

티스토리

Github · Wonprogrammer
hELLO · Designed By 정상우.
_won_

wonprogrammer

woncoding/TIL

TIL | 9.21.수 [자료구조와 알고리즘 / Python 복습 🐢]

2022. 9. 21. 23:58

- 자료구조와 알고리즘 [시간 복잡도 / 공간 복잡도 / 점근 표기법]


1. 시간 복잡도
시간 복잡도란? 입력값의 양에 따른 출력 시간의 복잡도

쉽게 말해 각 코드 한 줄 실행이 1번의 연산이라고 볼 수 있다.
(for, if, while 등 반복해서 실행되는 코드 또한 반복해서 세어준다 | 알고리즘을 위해 필요한 연산의 전체 횟수)

👉 입력값 N에 대하여 얼마나 비례하여 실행 되느냐가 제일 중요한 관건이라고 할 수 있다.

for num in array:              # array 의 길이만큼 아래 연산이 실행
    for compare_num in array:  # array 의 길이만큼 아래 연산이 실행
        if num < compare_num:  # 비교 연산 1번 실행
            break
    else:
        return num
            
 👉 array 의 길이만큼 N번 * array 의 길이만큼 N번 * 비교연산 1번 = N * N의 시간 복잡도



2. 공간 복잡도
공간 복잡도란? 알고리즘을 위해 필요한 메모리의 양 (저장공간의 차지)

쉽게 말해 저장된 변수, list, dict, index 등의 저장 공간(길이)를 얼마나 차지 하는지를 말한다.
공간 복잡도는 시간 복잡도 보다 중요성이 떨어지기 때문에 조금 더 시간 복잡도에 중점을 두고 코딩을 해야한다.

👉 이유는, 저장공간의 상수(메모리 차지 용량)가 아무리 크다해도, 시간 복잡도의 N에 얼마나 비례하여 실행되느냐에 따라 결과값은 쉽게 바뀌기 때문에 (아무리 더해봤자 곱하는걸 이기기 쉽지 않음 : 100+100+100+100+... vs 2*2*2*2*2*2*2*....)

 

🔥 중요도 🔥

시간 복잡도 >> 공간 복잡도





3. 점근 표기법
시간 복잡도와 공간 복잡도의 정도를 나타낼 수 있는 표기법
+ 모든 알고리즘을 표현하는 방식

[점근 표기법의 종류]

빅오(Big-O)표기법 빅 오메가(Big-Ω) 표기법
최악의 성능이 나올 때 어느 정도의 연산량이 걸릴것인가 최선의 성능이 나올 때 어느 정도의 연산량이 걸릴것인가
알고리즘에서 주로 쓰이는 표기법
(최악의 경우를 대비해야 하기 때문)
최상의 경우는 고려 할 필요성이 떨어짐


[우리가 고려해야 할 상황?]

  • 3-1) 입력값에 비례해서 얼마나 늘어날지 파악해보자. 1 ? N ? N^2 ?
  • 3-2) 공간복잡도 보다는 시간 복잡도를 더 줄이기 위해 고민하자.
  • 3-3) 최악의 경우에 시간이 얼마나 소요될지(빅오 표기법)에 대해 고민하자




[+ 참고 링크]
https://xodud2972.tistory.com/60

 

Python 51 - 시간복잡도, 공간복잡도, 빅오표기법 ( 알고리즘 공부 )

목차 1. 시간복잡도 2. 공간복잡도 3. 시간과 메모리 측정 개요 복잡도는 알고리즘의 성능을 나타내는 척도이다. 복잡도는 시간 복잡도와 공간 복잡도로 나눌 수 있다. 쉽게 말하면 시간 복잡도는

xodud2972.tistory.com

 


 

 

+ 자료구조와 알고리즘 추가

4. ASCII Code
컴퓨터는 알파벳을 숫자로 인식한다.
따라서, 알파벳을 추후에 계산하거나, 알고리즘에 맞게 적용하고 싶을 때 ASCII 코드로 변환해 활용할 수 있다.

[str.Isalpha]
str.Isalpha를 이용해 현재 입력된 str이 알파벳인지 아닌지 알려준다 (True / False)

print("a".isalpha())    # True
print("1".isalpha())    # False

s = "abcdefg"
print(s[0].isalpha())   # True


[ord(' ')]
알파벳을 → 숫자(ASCII 코드)로 변환하기 위해 ord() 를 이용한다.

print(ord('a'))               # 97
print(ord('a') - ord('a'))    # 97-97 -> 0
print(ord('b') - ord('a'))    # 98-97 -> 1



+ 알파벳의 빈도를 체크하기 위한 배열을 만들땐

alphabet_occurrence_array = [0] * 26

아스키 코드를 이용해 'a'=97 를 인덱스 0번으로 기준을 설정 모든 알바벳 번호에서 97을 빼주면 순서대로 1,2,3... 인덱스에 저장
👉 index[0] = 'a', index[1] = 'b', index[2] = 'c', ........ , index[25] = 'z'



5. 소수에서의 시간 복잡도
소수란? 1과 자기자신만을 약수로 갖는 수를 말한다.

  • 5-1) 주어진 자연수 N이 소수이기 위한 필요충분 조건은 N이 N의 제곱근(N ** 0.5)보다 크지 않은 어떤 소수로도 나눠지지 않는다.
  • 5-2) 주어진 자연수 N이 변수에 대해 나눴을때 나머지 == 0 이라면 소수(X) / 나머지 != 0 이라면 소수(O)


👉 예) 16의 제곱근 = 4이다 . (나눠떨어지지 않을땐 미만으로 계산 : 12의 제곱은 = 4(X) 3(O) )
그럼 16보다 작은 1 ~ 4의 배수들 중 16을 나눴을 때 나머지가 0이 아닌 수가 소수이다.

 

 

 


 

 

 

- 🐢 Python 복습 | 거북이 반 🐢 [class 상속]

 

1. 상속 | Inheritance 

Class에서 상속이란?

물려주는 클래스(Parent Class, Super class)의 속성과 메서드를 물려받는 클래스(Child class, sub class)가 가지게 되는 것입니다.

 

[선언방법]

class 부모클래스:
    ...속성...
    ...메서드...

class 자식클래스(부모클래스): 👉 부모클래스를 인자로 넣어 상속
    ...내용...

  활용 예)

class Country: 

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')


class Korea(Country): 

    def __init__(self, name):
        self.name = name

    def show_name(self):
        print('국가 이름은 : ', self.name)


test = Korea('대한민국')

print(test.name)        👉 '대한민국'
print(test.population)  👉 '인구'
print(test.capital)     👉 '수도'
test.show()             👉 '국가 클래스의 메소드입니다.'

test.show_name()        👉 '국가 이름은 : 대한민국'

 →  Korea Class에서 선언된 변수 'test'이지만 Country Class 상속을 받았기 때문에 population, capital 또한 선언가능

 

 

 

 

[메서드 오버라이딩]

  • 오버라이딩이란? 부모클래스에서 상속받은 그래로 속성과 메서드를 이용하지 않고 자식 클래스 내에서 재정의 하는것을 말한다.
  • 👉 자식클래스에서 재정의된 값만 출력됨
class Country: 

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')


class Korea(Country): 

    def __init__(self, name,population, capital):
        self.name = name
        self.population = population
        self.capital = capital
👉 입력값 새로 받아서


    def show(self):
        print('국가 이름은 : ', self.name)
        print('국가 인구는 : ', self.population)
        print('국가 수도는 : ', self.capital)
👉 재정의된 값 출력


test = Korea('대한민국', 50000, '서울')

print(test.name)
print(test.population)
print(test.capital)
test.show()

👉 국가명, 인구, 수도 → 대한민국 50000 서울 : 재정의됨

 

 

  • 부모클래스의 메소드도 수행하고, 자식클래스의 메소드의 내용도 함께 출력하기를 원할땐 super()를 이용하여 부모클래스를 호출한다.  👉 부모 클래스의 메서드 + 자식 클래스에서 재정의된 값 모두 출력
class Country: 

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')


class Korea(Country): 

    def __init__(self, name,population, capital):
        self.name = name
        self.population = population
        self.capital = capital


    def show(self):
        super().show()
        
        print('국가 이름은 : ', self.name)
        print('국가 인구는 : ', self.population)
        print('국가 수도는 : ', self.capital)


test = Korea('대한민국', 50000, '서울')

print(test.name)
print(test.population)
print(test.capital)
test.show() 👉 부모 클래스 + 자식 클래스 : 두 번 출력됨

 

 

'woncoding > TIL' 카테고리의 다른 글

TIL | 9.23.금 [Python 장고 / Django 기초🐢]  (0) 2022.09.23
TIL | 9.22.목 [Python 장고]  (0) 2022.09.22
TIL | 9.20.화 [Python 복습 🐢]  (0) 2022.09.20
TIL | 9.19.월 [Python 복습 🐢]  (0) 2022.09.19
TIL | 9.16.금 [Python 복습 🐢]  (0) 2022.09.19
    'woncoding/TIL' 카테고리의 다른 글
    • TIL | 9.23.금 [Python 장고 / Django 기초🐢]
    • TIL | 9.22.목 [Python 장고]
    • TIL | 9.20.화 [Python 복습 🐢]
    • TIL | 9.19.월 [Python 복습 🐢]
    _won_
    _won_
    Coding Practice blog

    티스토리툴바