Welcome! 🙋‍♂️ View more

Engineering 💻 39

[프로그래머스/Python] 경주로 건설

https://programmers.co.kr/learn/courses/30/lessons/67259 코딩테스트 연습 - 경주로 건설 [[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[ programmers.co.kr 🤔 문제. (0,0)에 있는 자동차가 (n-1,n-1)로 이동하는 데 드는 최소 비용을..

[Python] logging 사용법과 클래스화

Python에는 print라는 기능이 있다. 보통은 이 기능을 통해서 output을 확인한다. 그러나 print로는 output을 확인할 수 없는 경우가 있다. 필자는  airflow의 에러 로그가 print로는 확인되지 않아 logging 모듈을 활용했다. logging에서는 print보다 좀 더 다양한 기능을 제공하니, 한 번 알아보도록 하자! 😀 1. logging 모듈먼저 logging 모듈에 대해서 알아보자 1. log 출력 기준 log가 출력되는 기준을 설정합니다.출력 기준을 ERROR로 두게 된다면 그 아래 수준인 DEBUG/INFO/WARNING을 출력되지 않는다. 2. log 출력 형식asctime: 일자를 나타냅니다.levelname: 출력 수준을 나타냅니다.message: 출력 내용..

[Algorithm] 정렬 알고리즘 간단 정리와 Python 구현 (버블정렬, 선택정렬, 퀵정렬, 병합정렬, 힙정렬)

데이터 베이스는 이론상 무한 개의 데이터를 다룰 수 있어야 하기 때문에, 수많은 데이터를 얼마나 빠르게 정렬하는 가는 중요한 문제이다. 🤔 그렇다면 왜 데이터는 정렬되어 있어야할까? 간단히 말하자면 탐색을 위해서 이다. 정렬되어 있지 않은 데이터에서는 순차 탐색(O(N)) 밖에 사용할 수 없으나, 데이터가 정렬되어 있다면 이진 탐색(O(logN))이라는 알고리즘을 활용할 수 있다. 삽입/삭제가 자주 일어나는 데이터의 경우 정렬에 더 많이 시간이 들어감으로 순차 탐색을 사용하는 경우도 있지만, 보통의 경우는 데이터를 조회하는 경우가 훨씬 많다. 그리고 조회에 필요한 것이 검색(탐색)이다. 1. 버블 정렬 최댓값을 우선적으로 정렬하는 알고리즘이다. 👉 동작 방식 0부터 N-1까지 탐색하면서 인접한 칸과 비교..

[MongoDB] Timezone(타임존) 문제와 해결 (feat.Python)

Mongo DB는 Time zone이 UTC로 고정되어 있다. 따라서 Mongo DB에서 데이터를 불러올 때, Date 형식의 변수 값이 다를 수 있다. 필자의 경우, pymongo를 통해 데이터를 입력할 때는 정상적으로 되었으나, 추후 Spark를 통해 데이터를 읽어왔을 때 문제가 생겼다. 🤔 문제 필자는 네이버 종목토론방의 정보를 다루는 중이라서 이를 예시로 들겠다. 살펴보면 시간대가 9시간이 차이나는 것을 알 수 있다. 🤔 이러면 Date로 필터링할 때, 엄청난 혼선을 겪을 수 있다. 필자가 그랬다... 생각해보면 Pyspark에서 불러올 때 MongoDB의 시간대는 UTC이고, Pycharm 환경의 시간대는 한국(UTC+9)임으로 자동으로 9시간을 더한 것 같다. 그래서 이를 해결하기 위해서 이것..

Engineering 💻/DB 2022.02.19

[Spark] Exception while deleting Spark temp dir 에러 해결

Python에서 Spark을 실행할 때, 아래 에러가 나타났다. 살펴보니 Spark를 실행하는 동안 %Temp% 폴더에 폴더를 생성하는데, 그것을 지울 수 없다는 내용이다. 💡 우선 방법은 있다. %SPARK_HOME%\conf 폴더에 log4j.properties 파일을 수정하는 것이다. 만약 경로에 해당 파일이 없다면 log4j.properties.template를 복사하여 뒤에 .template를 지워주고, 만들어준다. 그리고 메모장으로 해당 파일을 열어 아래 명령어를 입력하고, 저장한다. log4j.logger.org.apache.spark.util.ShutdownHookManager=OFF log4j.logger.org.apache.spark.SparkEnv=ERROR 그러면 Python에서 S..

[Python] 참조한 모듈이 다른 모듈을 참조할 수 없는 경우 해결 (다른 모듈 참조하기)

파이썬으로 프로그램을 짤 때, 다른 모듈의 클래스나 함수를 사용하고 싶을 때가 있을 것이다. 필자 역시 그러했고, 그렇게 프로그램을 제작하고 있었다. 그러나 프로젝트의 구조를 바꾸고 나니, 제대로 동작하지 않는 경우가 있었다. 아래 경우를 살펴보자. 😫. 문제 상황 여기서 file1.py가 file2.py 모듈을 사용하기 위해서는 어떻게 해야할까? 여기에 대한 해답은 많은 곳에서 나와있다. 아래와 같이 해결하면 된다. # file2.py class Class2: def __init__(self): print('This is class in Class2') # file1.py # 상위 폴더를 참조할 수 있도록 설정한다. import sys, os sys.path.append(os.path.dirname(o..

[Python] 크롤링 방법과 비교 (requests, BeautifulSoup, selenium)

Python에서 웹 크롤링을 하는 방법은 두 가지가 있다. requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 파싱한다. selenium 라이브러리로 브라우저를 열어 웹 정보를 받는다.  보통 웹 컨트롤이 필요할 경우(클릭)에는 selenium을 활용하고, 그렇지 않다면 requests 방법을 이용하는 것이 일반적이다. 왜냐하면 selenium은 웹 브라우저를 여는 과정에서 많은 시간이 소요되기 때문에 비교적 속도가 빠른 requests가 좀 더 유리하기 때문이다.  🤔 궁금한 것그렇다면.... 만약 웹 컨트롤이 필요해서 selenium을 통해 웹 브라우저를 열어놓은 상태에서 웹 정보를 어떻게 가져오는 게 더 빠를까? 이번에는 그것을 알아볼 것이다.  👀 실험 준비이번에 크롤링할..

[DB] Index란 (feat. B+-Tree)

DB의 성능 DB는 많은 사람들이 공통으로 사용하는 데이터 모음이기 때문에, 대량의 데이터가 조회/저장되는 일이 빈번하게 발생한다. 그리고 이를 빠르게 진행하는 것이 무엇보다 중요하다. 이때 DB의 성능과 관련된 핵심이 디스크 I/O를 어떻게 줄이느냐이다. 디스크 I/O = 플래터(원판)을 돌리고, 디스크 헤더를 이동하여 데이터를 읽는 것을 의미한다. 물론 순차 I/O가 랜덤 I/O보다 빠르다. 하지만 현실은 대부분 랜덤 I/O이며, 이를 순차로 바꾸어 보자는 아이디어에서 Index와 쿼리 튜닝이 나타났다. Index란? Index란 추가적인 저장 공간을 활용하여 DB 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 DB 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸릴..

Engineering 💻/DB 2022.02.13

[PostgreSQL] Python에서 다중 행을 Insert하는 다양한 방법과 비교

🤔 Python으로 DB에 데이터를 입력할 때, 다중 행을 입력하는 경우가 많을 것이다. 이를 어떻게 실행해야 가장 빠르게 입력할 수 있을까? 😀 이러한 고민에 3가지 방법을 실행해봤고, 각 방법이 시간이 어떻게 차이나는 지 공유해보고자 한다. 먼저 입력할 데이터와 DB를 연결하자.사용될 데이터는 10만개의 행과 3개의 열을 가진 Integer 데이터를 사용할 것이다. DB는 PostgreSQL로 구축한 DB를 활용할 것이다.import timeimport psycopg2N = 100000data = [(i,i,i) for i in range(N)]print('data length: ', len(data)) #10만개의 행db = psycopg2.connect(host='localhost', dbna..

Engineering 💻/DB 2022.02.10

[알고리즘] 다이나믹 프로그래밍 (feat. Leetcode)

다이나믹 프로그래밍이란? 큰 문제를 작은 문제로 나누어 풀고, 작은 문제의 답을 재활용하는 기법을 의미한다. 메모리 비용을 활용하여 시간적 비용을 줄이는 방식이다. 👉 조건 부분 반복 문제: 작은 문제가 반복되는 경우 최적 부분 구조: 같은 문제는 구할 때마다 정답이 같을 경우 작은 문제가 반복되고 그 문제의 답이 같기 때문에, 굳이 작은 문제에 대한 계산을 반복하지 않고 이를 메모리에 저장하여 활용하는 것이다. Fibonacci 수열 DP를 설명할 때 가장 기본적으로 예를 들 수 있는 것이 Fibonacci 수열이다. 이는 f(n) = f(n-1) + f(n-2)의 점화식을 가진다. 아래 Leetcode 문제를 재귀 함수를 이용하는 방법과 동적 프로그래밍을 사용하는 방법으로 풀어볼 것이다. https:..

반응형