본문 바로가기

Python

(45)
[Python] 모든 지점에서의 최단경로를 찾는 플로이드 워셜(Floyd-Warshall) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 또 다른 최단 경로 알고리즘인 플로이드 워셜 알고리즘에 대해 알아보려고 한다. 저번 포스팅에서 배운 다익스트라(Dijkstra) 알고리즘은 특정 노드라는 시작 노드 1개를 지정하고 그 시작 노드에서 다른 노드들 까지의 최단거리를 구하는 방법이었다. 하지만 플로이드 워셜 알고리즘은 시작 노드를..
[Python] 우선순위 큐를 활용한 개선된 다익스트라(Dijkstra) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 저번 시간에 배웠던 다익스트라 알고리즘의 간단한 구현 방법에 이어 이를 개선한 우선순위 큐 즉, heapq를 활용한 개선된 다익스트라 알고리즘에 대해 알아보려고 한다. 다익스트라의 구현 개념에 대해서는 거의 유사하므로 해당 포스팅에서는 우선순위 큐를 어떤 부분에 활용하고 Python으로 구현..
[Python] 최단경로를 위한 다익스트라(Dijkstra) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의' '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 최단 경로를 찾는 데 자주 사용되는 다익스트라(Dijkstra) 알고리즘 개념에 대해 알아보고 Python으로 구현하는 방법에 대해 알아보려고 한다. 다익스트라 알고리즘은 최단 경로 알고리즘 종류 중 하나이다. 말 그대로 특정 지점에서 다른 특정 지점까지의 최단 경로를 구한다거나 모든 지점..
[Python] 알고리즘을 위한 주요 라이브러리와 유의점 이번 포스팅에서는 Python으로 알고리즘 문제를 해결할 때 주로 사용하는 라이브러리와 유의점에 대해 알아보려고 한다. 해당 라이브러리들을 적절히 사용하면 손쉽게 문제를 해결할 때가 종종 있다고 한다. 해당 포스팅에서 소개하는 주요 라이브러리들 이외에는 여기를 참고해서 확인해보자. 이외의 라이브러리들도 사용해서 문제를 해결하는 경우도 자주 있다고 하니 해당 링크를 참고해서 찾아 사용하는 습관을 기르는 것을 권장한다. 1. 내장함수 내장함수란, print 문이나 input 문 같은 기본 입출력 기능부터 sorted 같은 정렬 기능을 포함하는 기본 내장 라이브러리다. 1-1. sum sum 함수는 iterable한 객체(리스트, 딕셔너리, 튜플, 집합자료)가 입력으로 주어졌을 때, 모든 원소의 합을 반환한다..
[Python] staticmethod 와 classmethod 쓰임의 차이 이번 포스팅에서는 파이썬 클래스 문법에서 자주 마주칠 수 있는 staticmethod(정적 메소드)와 classmethod(클래스 메소드)의 차이점에 대해 예시 코드로 알아보려고 한다. 1. staticmethod 우선 staticmethod는 다음과 같은 특징을 지닌다. 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 할 수 있음 클래스 변수에는 접근 가능 생성자 포함 인스턴스 메소드 변수에는 접근 불가능 먼저 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 할 수 있는 경우이다. 하단의 코드를 살펴보자. class Parent: class_val = 'class variable' def __init__(self): self.name = 'younghu..
[Python] Class 에서 return self 는 무엇을 의미할까? 이번 포스팅에서는 Python Class 문법에서 self를 return 하는 즉, return self 문법이 들어가는 이유가 무엇인지, 또 이런 문법을 사용하면 어떤 기능을 가능하게 하는지에 대해 알아보자. 이에 대해서는 원문 StackOverflow 질문을 해석하면서 이해한 것이므로 원본 질문은 여기를 참고하자. return self 는 cascading 메소드를 가능하게 한다고 한다. cascading 메소드란 무엇일까? 먼저 다음과 같은 return self를 사용하는 코드 예시가 있다. class Counter: def __init__(self, start=1): self.val = start def increment(self): self.val += 1 return self def decre..
[Python] yield로 제네레이터 함수 만들기 이번 포스팅에서는 yield로 제네레이터 함수를 만드는 방법에 대해 알아보려고 한다. 제네레이터는 이터레이터를 생성해주는 함수이다. 제네레이터, 이터레이터에 대한 포스팅은 이전에 게시했던 적이 있다. 여기서는 yield를 사용해서 제네레이터 함수를 만드는 방법에 대해 간단히 알아보자. 다음과 같이 yield를 활용해서 0부터 9까지 출력하는 제네레이터 함수를 만들어보자. def generate_num(): for i in range(0, 10): yield i 이제 이 generate_num() 함수가 제네레이터 함수로서 제대로 기능하는지 살펴보자. 제네레이터는 list, set, tuple을 씌우게 되면 모든 원소를 담고 있는 하나의 객체로 반환이 되는데, 이 generate_num() 함수도 그렇게 ..
[Python] 클래스 상속 시 super() 의 쓰임 이번 포스팅에서는 Python에서 부모 클래스를 상속받을 때 자주 사용하는 super() 메소드에 대해 헷갈렸던 점을 기록하고자 한다. 우선 다음과 같은 부모 클래스가 있다고 가정하자. class Parent: def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 def add_string(self): return self.p1 + '+' + self.p2 위 Parent 클래스 생성자 함수에 인자(argument)가 필요한 상태이다. 이 상태에서 우리는 Parent 클래스를 상속받는 Child 클래스를 만들어보자. class Child(Parent): def __init__(self): self.c1 = 'child1' # 클래스 정의 child = Child..
[Python] Dynamic Programming(동적계획법) 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의'이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 "한 번 계산한 문제는 다시 계산하지 않도록 한다!" 는 다이나믹 프로그래밍(Dynamic Programming, 동적 계획법이라고도 함)에 대해서 소개해보고 이를 Python으로 구현하는 방법에 대해 알아보자. 다이나믹 프로그래밍은 메모리 공간을 약간 더 사용해서 연산 속도를 비약적으로 증가..
[Python] 순차(Sequential) 탐색과 이진(Binary) 탐색 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의'이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 이번 포스팅에서는 저번에 알아보았던 '탐색' 알고리즘의 또 다른 종류인 순차 탐색(Sequential Search)과 이진 탐색(Binary Search) 알고리즘에 대해 알아보고 Python으로 구현하는 방법에 대해 알아보려고 한다. 1. 순차 탐색(Sequential Search) 순차 탐색은 리스트 또는 ..
[Python] DFS/BFS 탐색 알고리즘과 다양한 정렬 알고리즘 🔊 이번 포스팅에는 최근에 Python으로 알고리즘을 공부하기 시작하면서 알게 된 여러 알고리즘의 원리와 Python으로 구현하는 방법에 대해 소개해보려 한다. 필자는 최근 알고리즘 공부를 '나동빈'님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬' 이라는 책과 백준 온라인 저지 사이트로 하고 있다. 이 중 '나동빈'님이 저자이신 책에서 가르쳐주는 내용을 기반으로 배운 내용을 정리해보려 한다. 알고리즘 종류가 다양하지만 이번에 배운 개념들은 탐색 알고리즘의 대표적 방법들인 DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색), 그리고 정렬 알고리즘의 종류들인 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬에 대해 알아보자. 또 각 챕터마다 하단에는 Python으로 알고리즘을 구현해 보기도 하자. 탐색..
[Python 중급] 일급함수(First-class)와 클로저, 데코레이터 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅에서는 파이썬의 일급함수(일급객체)의 특징에 대해 간단히 알아보고, 데코레이터를 만들기 위해 필요한 클로저에 대해 실습해보고 클로저 함수를 이용해 데코레이터까지 만들어보는 실습을 해보자. 1. 일급함수(First-class)의 특징 파이썬 일급함수의 특징으로는 다음의 4가지 특징이 존재 런타임 초기화 : 실행 시점에 초기화가 됨을 의미 함수를 변수에 할당이 가능 함수를 또 다른 함수 인자로 전달 가능 함수 결과를 다른 함수 결과값에 할당에 반환 가능 먼저 함수를 변수에 할당이 가능한 예시를 ..
[Python 중급] Python 시퀀스 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅은 파이썬의 시퀀스 자료구조에 대해서 알아보고 이에 대해 실습도 해보자. 우선 파이썬 데이터 타엡에 대해 세부적으로 분류해보자. 1번째 기준 : 자료 구성 형태 컨테이너 - 서로 다른 자료형 구성 가능 : 리스트, 튜플, collections의 deque 플랫형(Flat) - 한 개의 자료형으로 구성 : 문자열(str), bytes, bytes array, array, memoryview 2번째 기준 : 자료 구조의 변경 가능 여부 가변형 자료구조 : 리스트, bytes array, arra..
[Python 중급] Magic method와 named tuple 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 이번 포스팅은 지난 포스팅에서 잠깐 살펴보았던 Magic method(매직 메소드)에 대해 알아보고 실습 예제로 구현해보자. 또한 Tuple 성질을 지니지만 마치 파이썬 자료구조 중 하나인 Dictionary 처럼 Key, Value를 갖는 Named Tuple에 대해 알아보고 간단한 실습으로 구현해보자. 우선 Special method 라고도 불리우는 매직 메소드는 이미 내장되어(built-in) 만들어진 메소드를 의미한다. 즉, 다음 코드와 같이 int 형도 하나의 클래스이며 다음과 같은 여러가지 ..
[Python 중급] Class와 Method 심화 🔊 해당 포스팅은 인프런의 파이썬 중급 강의를 공부하면서 복습차원으로 정리한 포스팅입니다. 해당 내용은 주로 본인의 복습용이라서 자세한 설명은 없는 점 양해 부탁드리겠습니다. 원본 코드는 여기에 있습니다. 객체 지향 프로그래밍(OOP)는 코드의 재사용과 코드 중복을 방지하기 위한 프로그래밍 방법이다. 이번 포스팅에서 Python 클래스와 메서드에 대한 사용법에 대해 예시 코드로 알아보자. class Car(object): def __init__(self, company, detail): self._company = company self._detail = detail # Python에 내장되어 있는 메소드를 활용해서 인스턴스에 있는 정보 출력 가능 # __str__은 사용자 입장에서 사용하는 출력 메서드..
[Python웹크롤링] Selenium과 Webdriver를 이용한 브라우저 자동 검색 예전에 한 아주 자그마한 토이 프로젝트 이지만 selenium과 웹드라이버를 이용해서 네이버 검색창에 자동으로 키워드를 입력하는 걸 다시 복습할 겸 진행해보았다... 사실 다른 웹크롤링 강의를 듣고 실습하려다가 에러나고 빡쳐서...복습겸 쉬운 프로젝트좀 하려고 다시 건너왔다 ㅜㅜ 그럼 이제 본격적으로 간단한 코드인지만 코드에 대해서 분석해보고 의미를 이해해 보자! 우선 가장 필요한 셀레니엄 모듈에서 웹드라이버를 임포트한다. 그리고 난 크롬브라우저를 이용했기 때문에 내 로컬에 크롬웹드라이버가 저장되어 있는 경로를 작성해주고 웹드라이버를 활성화 시켜준다. 다음에 한 두가지의 설정은 브라우저가 켜질때 내부적으로 대기하는 시간을 설정하는 것이다. 지난 글에도 한번 적었던 적이 있는 기억이 있다. 그리고 내 컴퓨..
[Python웹크롤링] Selenium을 이용해 사람인 채용정보 크롤링 웹크롤링 강의를 배우면서 가장 유용한 패키지 두개를 꼽으라고 하면 BeautifulSoup와 Selenium이라고 할 수 있겠다. 설연휴 전에 강의를 들어 배웠었지만 설연휴동안 일하면서 복습도...공부도... 쉬다보니 연휴가 끝나니 머리가 백지상태 처럼 되었었다.. 그래서 다시 토이프로젝트 처럼 복습차원 겸 다시 웹크롤링 예제를 만들어 보려고 한다. 요즘 노마드 코더 아카데미를 이용해서 웹크롤링에 대한 다른강의를 또 듣고 있는데 패스트 캠퍼스와는 다른 방법을 쓰는 거 같기도 해서 신기하기도 했지만 더 어지러워진 것 같다... 이번에 하기로 한 것은 '사람인' 이라는 채용정보 사이트에서 '데이터 엔지니어'를 검색하고 나오는 '채용정보' 와 '채용마감시간' 이렇게 2가지 정보를 각각 연속적으로 크롤링 해보았..
[Python웹크롤링] REST API에 대한 이해 웹크롤링을 하면서 웹사이트에 정보를 요청하고 받는 과정을 배우면서 REST API에 대해서 공부를 좀 하게 되었다. 그런데 사실 어려운 개념이기도 한 것 같고 여러 블로그의 글을 찾아보다가 너무 모르겠어서 유투브에 깊게는 아니지만 얕게라도 쉽게 설명해 놓은 영상을 찾았고 추가적으로 조대협님의 블로그의 글을 참고하며 얕게나마 개념을 설명하고 유투브 영상 링크를 걸어 놓기로 하겠다. REST의 유래 REST는 웹의 본래 우수성을 100% 활용하지못하고 판단하여 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐 즉 개발자들끼리의 약속(?)같은 형식을 만들었는데 그것이 REST(Representational Safe Transfer) 이다. REST의 요소 REST = 리소스 + 메소드 + 메세지 이..
[Python웹크롤링] Session 활성화와 Cookie 전송 받기 이번엔 웹 브라우저에 요청하고 데이터를 가져올 때 Session을 활성화 하는 방법과 https://httipbin.org 불러오는 중입니다... 위 홈페이지를 통해서 Cookie 정보를 이용해 쿠키정보를 수신하는 방법에 대해서 공부해 보려 한다. 우선 requests를 import하고 s 라는 변수에 requests.Session() 으로 세션을 활성화 시켜준다. 그리고 r 이라는 변수에 get 방식을 이용해 특정 url 을 할당시켜준다. 그리고 .text 함수를 사용해 데이터를 확인해본다. 뿐만 아니라 수신 받을 때 정상적으로 잘 받았는지 '200' 이라는 코드를 확인하기 위해 .status_code 를 통해서 확인해 본다. 여기서 참고적으로 .ok 라는 함수를 이용해서도 수신 상태를 확인 해 볼 수..
[Python웹크롤링] 웹크롤링시 User-Agent의 사용 웹크롤링에 대해서 배우다 보면 우리 사람이 컴퓨터를 키고 웹브라우저에 접속하는 프로세스에 대해서 감을 익히게 된다. 개인적으로 이런 느낌을 받은 적은 바로 User-Agent 개념에 대해서 배우고 난 뒤인 것 같다. 물론 특정 웹마다 다르겠지만 어떤 웹브라우저는 get, post 방식을 날리는 상대방이 컴퓨터인걸 알면 해당 웹에 접속하는 것을 차단하는 경우가 있다. 우리는 이를 방지하기 위해서 " 나 컴퓨터아니고 사람이야 ! " 라고 사람인 ' 척 ' 하기 위해 User-Agent를 사용한다고 생각하면 되겠다. 본격적으로 내가 해당 개념을 배울 때 작성했던 코드를 살펴보자. User-Agent 클래스는 보통 fake_useragent라는 패키지에서 import를 시킨다.. 패키지 이름이 ' 가짜 유저 '..