해당 글은 프로그래머스 사이트의 코딩테스트 연습 중

Lv3. 오랜 기간 보호한 동물(2) 문제의 풀이 입니다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/59411

 

풀이

SELECT AI.ANIMAL_ID, AI.NAME FROM ANIMAL_INS AI 
LEFT JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
ORDER BY DATEDIFF(AO.DATETIME, AI.DATETIME) DESC
LIMIT 2;

 

DATEDIFF 함수 : ([단위], 시작날짜, 끝날짜) 로 시간의 간격을 알 수 있음. 

- Merge Sort



정렬할 배열을 재귀적으로 정확히 반으로 나누면서 정렬과 병합을 반복하는 형식으로 정렬하는 방법


pseudo code


mergeSort(A[], p, r) {            // A[] : 정렬할 원 배열, p: 현재 함수에서 가리키는 배열의 처음 위치, r: 배열의 마지막 위치

if(p<r) {                       // p가 r보다 작을 경우. 즉, 더 이상 나눌 수 없을 때 까지 분할을 실행

q = (p+r) / 2;         // 배열의 위치 p와 r을 이용해서 중간 값 q를 구함

mergeSort(A, p, q);        // 반으로 나눈 왼쪽 재귀적 실행

mergeSort(A, q+1, r);     // 반으로 나눈 오른쪽 재귀적 실행

merge(A, p, q, r);           // 왼쪽과 오른쪽을 병합

}

}


동작 예)



- Quick Sort


정렬할 배열을 재귀적으로 나누되, 기준점(pivot)을 설정하여 더 큰 값과 작은 값으로 나눠서 정렬하는 방법


pseudo code


quickSort(A[], p, r) {                    // A[] : 정렬할 원 배열, p: 현재 함수에서 가리키는 배열의 처음 위치, r: 배열의 마지막 위치

if(p<r) {                             // p가 r보다 작을 경우. 즉, 더 이상 나눌 수 없을 때 까지 분할을 실행

q = partition(A, p, r);       // pivot을 기준으로 왼쪽과 오른쪽 부분배열로 분할

quickSort(A, p, q-1);        // pivot의 왼쪽 부분배열 재귀적 실행

quickSort(A. q+1, r);        // pivot의 오른쪽 부분배열 재귀적 실행

}

}


동작 예)


기준점(pivot)은 어떤 값으로 해도 상관 없으나, 현재는 각 분할의 가장 오른쪽 값으로 설정했을 경우


i : 기준점보다 작은 값들의 마지막 배열 위치

j : 현재 확인중인 배열 위치

x : 기준점


1. 배열의 처음부터 j번째의 값과 기준점의 값 x를 비교하여 A[j]가 같거나 크면 pass, 적으면 A[i+1] 값과 A[j] 값을 치환한 다음 i를 1 더해줌

(i 앞의 값들은 모두 기준값보다 작고 뒤의 값들은 모두 크도록 만듬)


2. 배열의 값을 전부 확인한 경우에 A[i+1] 값과 A[x] 값을 치환 

(기준값을 기준값보다 작은 부분배열과 기준값보다 큰 부분배열의 사이에 위치시킴)




Merge Sort 보다 Quick Sort가 빠른 이유


- 병합 과정에서 유리함


Merge Sort는 병합 과정의 왼쪽과 오른쪽 데이터를 합치는 동작에서 정렬을 한 번 더 진행해야 한다.

또한, 해당 정렬을 진행하는 과정에서 임시 배열을 하나 생성해야 함.


하지만 Quick Sort의 경우에는 원 배열을 부분배열로 분할하기는 하지만 병합이라는 과정이 없기 때문에

임시 배열을 만들거나 병합 시에 데이터를 재 정렬할 필요가 없음.

 

# -*- coding: utf-8 -*-
"""
This example demonstrates many of the 2D plotting capabilities
in pyqtgraph. All of the plots may be panned/scaled by dragging with
the left/right mouse buttons. Right click on any plot to show a context menu.
"""
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg



#QtGui.QApplication.setGraphicsSystem('raster')
app = QtGui.QApplication([])

#mw = QtGui.QMainWindow()
#mw.resize(800,800)



win = pg.GraphicsWindow(title="Basic plotting examples") # PyQtGraph grahical window
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting') # Title of python window



# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)


# Basic Array Plotting
p1 = win.addPlot(title="Basic array plotting", y=np.random.normal(size=100))


# Multiple Curves
p2 = win.addPlot(title="Multiple curves")
p2.plot(np.random.normal(size=100), pen=(255,0,0), name="Red curve")
p2.plot(np.random.normal(size=110)+5, pen=(0,255,0), name="Green curve")
p2.plot(np.random.normal(size=120)+10, pen=(0,0,255), name="Blue curve")


# Drawing with Points
p3 = win.addPlot(title="Drawing with points")
p3.plot(np.random.normal(size=100), pen=(200,200,200), symbolBrush=(255,0,0), symbolPen='w')


# Next Row
win.nextRow()


# Parametric, Grid Enabled
p4 = win.addPlot(title="Parametric, grid enabled")
x = np.cos(np.linspace(0, 2*np.pi, 1000))
y = np.sin(np.linspace(0, 4*np.pi, 1000))
p4.plot(x, y)
p4.showGrid(x=True, y=True)


# Scatter Plot, Axis Labels, Log Scale
p5 = win.addPlot(title="Scatter plot, axis labels, log scale")
x = np.random.normal(size=1000) * 1e-5
y = x*1000 + 0.005 * np.random.normal(size=1000)
y -= y.min()-1.0
mask = x > 1e-15
x = x[mask]
y = y[mask]
p5.plot(x, y, pen=None, symbol='t', symbolPen=None, symbolSize=10, symbolBrush=(100, 100, 255, 50))
p5.setLabel('left', "Y Axis", units='A')
p5.setLabel('bottom', "Y Axis", units='s')
p5.setLogMode(x=True, y=False)


# Updating Plot
p6 = win.addPlot(title="Updating plot")
curve = p6.plot(pen='y')
data = np.random.normal(size=(10,1000))
ptr = 0
def update():
global curve, data, ptr, p6
curve.setData(data[ptr%10])
if ptr == 0:
p6.enableAutoRange('xy', False) ## stop auto-scaling after the first data set is plotted
ptr += 1
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)


# Next Row
win.nextRow()


# Filled Plot, Axis Disabled
p7 = win.addPlot(title="Filled plot, axis disabled")
y = np.sin(np.linspace(0, 10, 1000)) + np.random.normal(size=1000, scale=0.1)
p7.plot(y, fillLevel=-0.3, brush=(50,50,200,100))
p7.showAxis('bottom', False)


# Region Selection
x2 = np.linspace(-100, 100, 1000)
data2 = np.sin(x2) / x2
p8 = win.addPlot(title="Region Selection")
p8.plot(data2, pen=(255,255,255,200))
lr = pg.LinearRegionItem([400,700])
lr.setZValue(-10)
p8.addItem(lr)


# Zoom on Selected Region
p9 = win.addPlot(title="Zoom on selected region")
p9.plot(data2)
def updatePlot():
p9.setXRange(*lr.getRegion(), padding=0)
def updateRegion():
lr.setRegion(p9.getViewBox().viewRange()[0])
lr.sigRegionChanged.connect(updatePlot)
p9.sigXRangeChanged.connect(updateRegion)
updatePlot()


## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()

일반적으로 Python 환경에서 matplotlib를 가장 많이 사용하는데

 

실시간으로 업데이트 되는 그래프를 표시하기에 너무 느립니다.

 

찾아보니 PyQtGraph라는 라이브러리가 속도도 빠르고 수학적인 표현을 할 때

 

좋은 그래프가 많다고 하네요.

 

다만, 홈페이지의 문서가 상당히 불친절하게 되어 있어서 정보를 찾기가 쉽지 않습니다.

 

잘 사용만 한다면 쓸만한 그래픽 툴인 것 같습니다.

'Programming Languages > Python' 카테고리의 다른 글

[Python] Numpy, Pandas 레퍼런스 가이드 문서  (0) 2018.08.16

라이브러리의 각종 사용법 및 명령어들을 알 수 있음.


Numpy

https://docs.scipy.org/doc/



Pandas

https://pandas.pydata.org/pandas-docs/stable/index.html



+ Recent posts