전체 글 79

[알고리즘] 합병정렬(Merge sort)이란?

1. 합병정렬이란?Merge sort 합병정렬(Merge sort)이란, 분할과 정복(divide and conquer)의 개념을 이용하여 주어진 배열이 하나의 원소들을 가질 때 까지 쪼개고, 다시 합치는 방식으로 정렬하는것을 말한다. 이미 ‘정렬된 리스트 두 개가 주어지고, 그 두 개를 합쳐서 새로운 정렬된 리스트를 만든다’ 라고 정리할 수 있다. 리스트들을 쪼개서 원소를 하나 가진 리스트가 되면, 그 리스트는 이미 내부적으로는 정렬이 완료된 리스트가 된다. 그렇게 정렬이 완료된 두 개의 리스트의 원소를 비교해서 합치면, 정렬이 완료된 리스트 하나가 탄생하게 되는 원리이다. 2. 합병정렬의 예시array A = {5,2,4,7,1,3,2,6}이 주어졌을 때, 이 배열 A를 merge sort를 이용해 ..

대학원 2023.05.21

[알고리즘] 삽입정렬(Insertion sort)이란?

1. 삽입정렬이란? Insertion sort 삽입정렬(Insertion sort)이란, 단어 그대로 삽입(insertion)을 이용한 정렬이라고 할 수 있다. 정렬하고자 하는 대상인 키와 정렬된 키들의 목록이 주어지면, 키를 정렬 순서가 유지되도록 삽입하는 것을 말한다. 즉, 삽입 정렬이란 정렬하고자 하는 원소를 key로 설정한 뒤 그 앞의 정렬된 목록과 비교해가면서 어느 위치에 들어가게 될지를 결정하는 정렬을 말한다고 할 수 있다. 만약 사이즈가 n인 어레이가 주어지면, 삽입정렬에서는 두 번째 원소부터 정렬을 시작하게 된다. 두 번째 원소부터 시작하는 이유는 삽입 정렬을 하기 위해서는 정렬의 대상이 되는 key와 정렬이 들어갈 수 있는 정렬된 목록이 필요하기 때문인데, 첫 번째 원소를 key로 설정하..

대학원 2023.05.07

점근표기법(Asymptotic notation) 이란?

1. 점근표기법 Asymptotic notation 점근표기법(Asymptotic notation)이란 알고리즘의 시간복잡도, 공간복잡도를 표현하는데 사용되는 표기법이다. 시간복잡도란 알고리즘이 문제를 해결할 때 어느 정도의 시간이 소요되는지를 의미하며, 공간복잡도란 알고리즘이 문제를 해결할 때 얼마나 많은 메모리를 차지하는지를 의미한다. 최근에는 메모리의 용량이 크고 빠르기 때문에 공간복잡도 보다는 시간복잡도를 조금 더 먼저 고려하는 경향을 보이고 있다. 이런 알고리즘의 효율성은 데이터의 개수와 기본 연산의 횟수에 따라서 결정된다. 이러한 점근 표기법을 사용하는 데에는 크게 3가지 이유가 있다. 1. 성능 비교 다양한 알고리즘이 있을 때, 이를 비교해서 가장 좋은 성능을 가지는 알고리즘을 선택해야 한다..

대학원 2023.04.23

[CPython 파헤치기] 1~4 장 파이썬 언어와 문법

CPython 파헤치기를 기본으로 공부하며 작성한 글입니다. CPython Cpython 이란? 기본적으로 우리가 많이 활용하는 파이썬으로, C언어로 작성된 파이썬 인터프리터를 의미한다. Cpython이 파이썬이 아니라 C로 작성된 이유는 컴파일러의 작동 방식 때문인데, 새로운 프로그래밍 언어를 만들려면 컴파일러를 컴파일 할 수 있는 프로그램이 필요하고 이를 개발는 데에는 가장 안정적이고 오래된 언어로 먼저 작성되기 때문이다. 특히 윈도우와 리눅스 커널 API가 모두 C로 작성이 되어 있기 때문에 C로 선택하는 것이 꽤나 합리적인 선택이었다고 한다. 파이썬의 문법 파일은 파서 표현식 문법(Parsing Expression Grammer, PEG) 사양을 사용한다. * : 반복 + : 최소한 한 번 반복 ..

Python/CPYTHON 2023.03.30

[파이썬 클린코드] Chapter5 : 데코레이터를 사용한 코드 개선

파이썬 클린코드 2nd edition 을 읽고 정리한 내용입니다. 1. 파이썬의 데코레이터 데코레이터는 일종의 문법적 설탕(syntax sugar)이라고 할 수 있는데, 데코레이터 이후에 나오는 것을 첫 번째 파라미터로 사용하여 결과 값을 반환하게 하기 때문이다. 이렇게 데코레이터를 사용하게 되면, 한 곳에서 함수의 전체 정의를 찾을 수 있게 되어 가독성을 크게 향상시킬 수 있게 된다. 데코레이터는 함수, 메서드, 제너레이터, 클래스 등 어떤 호출 가능한 객체에도 적용이 가능하다. 1-1. 함수 데코레이터 데코레이터를 사용하여 기능을 변경하는 가장 간단한 방법이다. 활용 방법 파라미터 유효성 검사 사전 조건 검사 기능 전체 정의 서명 변경 원 함수의 결과 캐시 등 def uppercase_decorato..

소주콘 Shot 3 : 처음처럼 새로 소주 - 2023에 새로 한잔! 참석 후기

일전에 다녀왔던 데이터 분석가 밋업에 탄력받아, 소주콘에도 다녀왔다. 소주콘은 소문난 주니어 컨퍼런스의 줄임말로 이름에서도 알 수 있듯이 주니어를 위한 컨퍼런스이며, 이번이 3회째 개최되는 컨퍼런스다. 2회차때에 가려고 했는데 조금 이따가 해야지~하다가 표가 다 팔리는 바람에 못 갔기에 너무 아쉬웠는데 다행히도 이번에는 놓치지 않고 바로 티켓을 구매해서 다녀올 수 있었다. 소주콘은 마루180에서 진행되는데 단순히 컨퍼런스용 임대 공간이 아니라 여러 스타트업들도 많이 입주한 곳 같아서 신기했다. QR로 입장 체크를 한다고 봤는데, 그렇게 하지는 않았고 그냥 이름 말하고 명찰에 이름 적고 들어갔다. 간단한 샌드위치를 제공해주신다고 해서 따로 저녁을 안 먹고 갔는데, 위잇이 있어서 반가웠다. 1.리이오님 같이..

[파이썬 클린코드] Chapter4 : SOLID원칙-2

파이썬 클린코드 2nd edition 을 읽고 정리한 내용입니다. 3. 리스코프 치환 원칙 Liskov substitution priciple 설계의 안정성을 높이기 위해서 객체가 가져야 하는 일련의 특성. 클라이언트가 특별히 신경쓰지 않더라도, 부모 클래스 대신 자식 클래스를 사용해도 정상적으로 동작해야 한다는 것을 의미한다. 3-1. 도구를 사용해 LSP검사하기 mypy나 pylint등을 사용하여 LSP문제를 검출해 낼 수 있다. 만약 코드 전체에 타입 어노테이션을 사용하고, mypy를 설정한 경우에는 초기에 기본 오류 여부와 LSP준수 여부를 빠르게 확인할 수 있게 된다. 3-2. 예시 class Rectangle: def __init__(self, width, height): self.width ..

[파이썬 클린코드] Chapter4 : SOLID원칙-1

파이썬 클린코드 2nd edition 을 읽고 정리한 내용입니다. 0. SOLID란? S : 단일 책임 원칙 O : 개방 / 폐쇄의 원칙 L : 리스코프 치환 원칙 I : 인터페이스 분리 원칙 D : 의존성 역전 원칙 1. 단일 책임 원칙 Single Resposibility Principle 클래스와 같은 소프트웨어 컴포넌트는 단 하나의 책임만을 져야 한다는 원칙. 도메인의 문제가 변경되는 경우에만 변경이 필요하고, 다른 이유로 변경이 필요하다면 그것은 추가적인 추상화가 필요함을 의미하게 된다. 1-1. 너무 많은 책임을 가진 클래스 독립적인 동작을 하는 클래스를 하나의 인터페이스에 정의하는 경우에는 유지 보수를 어렵게 하고, 오류가 발생할 확률을 높게 한다. 1-2. 책임 분산 모든 메서드를 다른 클..

맥 터미널에서 환경 변수 설정하기

바쁘신 분들을 위한 정리 맥에서 환경 변수 설정 시 터미널에서 zsh를 이용하므로 bash_profile 수정이 아니라 zshrc 수정을 해야 한다. 원래 나는 윈도우 기반으로 업무를 했었는데, 이번에 맥을 받아서 자동으로 돌리던 파일들을 옮겨서 실행하기로 했다. 그런데! 맥은! 왜! 항상! 쉬운게! 없는지! 오라클에서 데이터 가져오려고 cx_Oracle 사용을 했는데 DatabaseError: ORA-12154: TNS:could not resolve the connect identifier specified 라는 오류가 발생했다.... 찾아보니 TNS환경 변수와 관련한 오류라고 하길래 알아봤더니 1. 원래 오라클은 tnsnames.ora를 정해진 경로에서 기본적으로 찾는데(Oracle name어쩌구 ..

기타 2023.03.15

[파이썬 클린코드] Chapter3 : 좋은 코드의 일반적인 특징

파이썬 클린코드 2nd edition 을 읽고 정리한 내용입니다. 계약에 의한 디자인 계약이란, 통신 중에 지켜져야 할 규칙을 문서화 하는 것을 의미한다. 계약에서는 주로 사전조건과 사후 조건을 명시하며, 때로는 불변식이나 부작용을 기술하기도 한다. 즉, 계약을 통해서 각 컴포넌트들이 지켜야 할 부분을 명시하고 그 것을 기반으로 개발하는 것을 의미한다. 이렇게 하면 여러가지 장점들이 있는데 검증에 실패한 경우 오류를 쉽게 찾아서 수정 가능 사전조건의 경우 클라이언트, 사후조건은 컴포넌트 등 서로 연관되어 있는 부분이 다르기 때문에 책임소재를 신속하게 파악 가능함 사전조건의 경우 런타임 중에 조건이 맞는지 확인할 수 있기 때문에 조건이 맞지 않는다면 실행하지 않아야 함 등을 들 수 있다. 사전조건 함수나 ..