알고리즘 뽀개기

Sawol·2021년 3월 16일
post-thumbnail

❗️ 계속해서 업데이트 될 예정...

파이썬과 다른 언어 비교

구조체(Struct)

C 언어에서의 구조체

  • 메모리의 어느 영역에나 어떤 크기로든 할당할 수 있음
  • 파이썬에서 클래스의 형태와 비슷함
# 구조체 사용안함
int scoreKOR[10];
int scoreMAT[10];
int scoreENG[10];
int scoreSCI[10];

# 구조체 사용함
struct score
{
    int scoreKOR
    int scoreMAT
    int scoreENG
    int scoreSCI
}

void main()
{
    struct score s;
}

>>> 
s.scoreKOR = 100;
s.scoreMAT = 100;
s.scoreENG = 80;
s.scoreSCI = 50;

Python에서의 구조체

  • 파이썬에서는 구조체가 없음
  • 데이터 클래스를 타입 힌트와 함께 활용하여 구조체 형태로 정의 가능
@dataclass
class score:
    scoreKOR: int = None
    scoreMAT: int = None
    scoreENG: int = None
    scoreSCI: int = None
    
s = Product()
s.scoreKOR = 100
s.scoreMAT = 100
s.scoreENG = 80
s.scoreSCI = 50

원시 타입(Primitive Type)

CJava에서 원시 타입

  • CJava에서 제공하는 타입
  • short, long, float, double, int 등이 있음
  • 메모리에 정확하게 타입 크기만큼의 공간을 할당하고 그 공간을 오로지 값으로 채움
  • CJava는 성능에 대한 우선순위가 높기 때문에 이러한 타입이 존재

Python에서의 원시 타입

  • 원시 타입을 지원하지 않음
  • 성능보다 기능에 우선순위가 높기 때문
  • 원시 타입보다 훨씬 다양한 기능을 제공할 수 있는 객체 타입을 선택
  • C로 구현된 넘파이(Numpy) 모듈은 내부적으로 C의 원시 타입으로 처리하기 때문에 빠름

파이썬 문법

파이썬 네이밍컨벤션(Naming Convention)

  • 스네이크 케이스(Snake Case) - PEP8의 권장 사항
  • 클래스명에 한해서는 카멜 케이스(Camel Case)
# bad
valueName: int = 1

class casename:
    pass

# good
value_name: int = 1

class CaseName:
    pass

range

  • 제너레이터를 대표하는 함수
  • 생성 조건만 보관하고 있기 때문에 메모리 점유율이 항상 똑같음
  • 인덱스로 접근 시에는 바로 생성하도록 구현되어 있음
import sys

a = [i for i in range(10000000)]
b = range(10000000)

print(len(a), len(b))
>>> 10000000 10000000

print(sys.getsizeof(a), sys.getsizeof(b))
>>> 81528056 48

print(b[1999])
>>> 1999

구글 파이썬 스타일 가이드

  • 파이썬 공식 스타일 가이드 PEP 8에 없는 좋은 지침들이 있음

함수의 기본 값으로 가변 객체(Mutable Object)를 사용하지 않아야 한다.

  • 기본 값으로 [], {} 사용하는 것을 지양해야 함
  • 함수가 객체를 수정하면 기본 값도 변경되기 때문
  • 이에 대한 좋은 글
  • 함수의 기본 값은 __defaults__라는 매직 메서드에 저장됨
  • 즉, 기본 값을 가변 객체로 설정하면 __defaults__에 기록된 기본 값이 계속 업데이트가 됨
# bad
def add_5_in_list(ls = []):
    ls.append(5)
    return ls

print(add_5_in_list.__defaults__)
add_5_in_list()				# ([5],)
add_5_in_list() 			# ([5, 5],)
add_5_in_list()				# ([5, 5, 5],)
print(add_5_in_list.__defaults__)

>>> ([],)
>>> ([5, 5, 5],)
    
# good => 불변 객체 사용
def add_5_in_list(ls = None):
    if ls is None:
        ls = []
    ls.append(5)
    return ls

print(add_5_in_list.__defaults__)
add_5_in_list()				# ([5],)
add_5_in_list() 			# ([5],)
add_5_in_list()				# ([5],)
print(add_5_in_list.__defaults__)

>>> ([],)
>>> ([],)

TrueFalse를 판별 할 때는 암시적인 방법과 명시적인 방법을 잘 활용해야 한다.

  • 리스트나 딕셔너리가 비었는지를 확인할 때는 암시적인 방법을 사용하는 것이 간결하고 가독성이 높음
# bad
if foo != []:
    foo.append(5)
    
# good
if foo:
    foo.append(5)
  • 정수를 처리할 때는 암시적인 방법보단 명시적인 방법이 가독성이 좋고 덜 위험함
# bad
if not foo:
    foo += 10
    
# good
if foo == 0:
    foo += 10

파이썬다운 방식
" 문제를 풀어낼 때는 바람직하고 유일하며 명확한 방법이 존재할 것이다. "

파이썬의 자료형

숫자

  • 파이썬에서는 정수형으로 int만 제공
    int가 충분하지 않다면 자동으로 long으로 바꿔줌
  • bool은 논리 자료형인데 파이썬 내부에서는 1(True0(False)로 처리되는 int의 서브 클래스임
    object class > int class > bool class

시퀸스(Sequence)

  • 특정 대상의 순서 있는 나열

불변 객체

  • 메모리에 불변 객체가 올라가면 반납될 때까지 그 객체는 변하지 않음
  • 변수는 오직 이 객체를 가리키는 포인터 역할
  • 객체에 값을 '추가'한다는 것은 새로운 객체를 할당 받는 것임
a = b = 10
a += 1

print(a, b)
>>> 11 10

가변 객체

  • 메모리에 가변 객체가 올라가면 그 객체를 수정할 수 있음
a = b = [1,2,3,4]
a[1] = 10

print(a, b)
>>> [1, 10, 3, 4] [1, 10, 3, 4]

자료구조 vs 자료형 vs 추상 자료형

자료구조(Data Structure)

  • 데이터에 효율적으로 접근하고 조작하기 위한 데이터의 저장 구조

자료형(Data Type)

  • 컴파일러 또는 인터프리터에게 프로그래머가 데이터를 어떻게 사용하는지를 알려주는 데이터의 속성
  • 자료구조에 비해 더 구체적임
    배열(자료구조) - 리스트(자료형)

추상 자료형(Abstract Data Type, ADT)

  • 자료형에 대한 수학적 모델을 지칭
  • 행동만을 정의할 뿐 실제 구현 방법은 명시하지 않음

리스트

리스트의 연산 속도

리스트의 특징

  • 리스트는 각 요소에 대한 포인터 목록을 관리하는 형태로 구현
  • 즉, 연결 리스트에 대한 포인터 목록을 배열 형태로 관리하고 있음
  • 그렇기 때문에 리스트 요소로 정수, 문자, 불리언 등 다양한 타입이 동시에 올 수 있음

딕셔너리

딕셔너리 연산 속도

딕셔너리의 특징

  • 3.7버전부터 입력 순서 유지
  • 내부적으로 해시 테이블로 구현
  • 불변 객체를 키로 사용 가능
  • 입력, 조회 모두 O(1)

파이썬에서 최댓값과 최솟값

sys 모듈

  • 시스템에서 만들 수 있는 가장 높은 값, 낮은 값
mx = -sys.maxsize
mn = sys.maxsize

float()

  • 무한대 생성
mx = float('-inf')
mn = float('inf')

0개의 댓글