Zero to Hero
53. Maximum Subarray
Algorithm 2021. 5. 2. 23:05

Maximum Subarray - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. prefix sum을 이용한 풀이 class Solution: def maxSubArray(self, nums: List[int]) -> int: if len(nums) == 1: return sum(nums) prefix = [nums[0]] for index, num in enumerate(nums): if index == 0: continue prefix.append(nu..

article thumbnail
SQL 레벨업 03
Review 2021. 5. 2. 21:33

서브 쿼리의 문제점 - 연산 비용 추가 - 즉 select 구문을 또 수행하는 것이기 때문에 서브 쿼리마다 select 구문을 실행해서 데이터를 만들어야 한다. - 데이터 I/O 비용 발생 - 서브 쿼리는 일반 쿼리와 다르게 명시적인 제약 또는 인덱스가 작성된 테이블과 다르게 그러한 메타 정보가 전혀 없다. - 따라서 옵티마이저가 쿼리를 해석하기 위해 필요한 정보를 서브 쿼리에선 얻을 수 없다. - 이에 대한 대책으로 VIEW 병합(서브 쿼리 내부 로직가 외부 로직을 결합해서 하나의 실행 계획을 만드는 것)이라는 기법이 있긴 하다. 서브 쿼리를 사용해서 더 효율적인 상황도 있다 - 서브 쿼리와 결합을 윈도 함수로 대체하면 성능을 개선할 가능성이 있다. - 결합 작업을 할 때 옵티마이저가 결합 대상 레코드..

article thumbnail
SQL 레벨업 02
Review 2021. 5. 2. 21:10

UNION은 대부분의 상황에서 비효율적인 쿼리일 가능성이 높다. CASE로 분기하자. - 외부적으로는 하나의 SQL 구문을 실행하는 것처럼 보이지만 - 내부적으로는 여러 개의 select 구문을 실행하는 실행 계획으로 해석된다. - 즉 테이블에 접근하는 횟수가 많아져 I/O 비용이 늘어난다. - (SQL UNION SQL) 이렇게 있으면 SQL 각각 select 연산을 수행한다. - select 구문으로 분기하지 않고 CASE 구문으로 분기하는 접근만으로도 SQL 효율을 올릴 수 있다. 결합 알고리즘 - JOIN 연산을 수행할 때 옵티마이저가 선택하는 알고리즘 - Nested Loops - Hash - Sort Merge의 크게 3가지가 있다. - 참고로 MySQL은 Nested Loops만을 공식적으로..

article thumbnail
SQL 레벨업 01
Review 2021. 5. 2. 20:29

DBMS의 개략적인 구조 1. 쿼리 평가 엔진 - Pareser + Optimizer + 플랜 실행 + 연산 평가 - 입력받은 SQL 구문을 분석하고, 어떤 순서로 기억장치의 데이터에 접근할지 결정해 실행 계획을 세움 2. 버퍼 매니저 - DBMS의 버퍼를 관리한다. 3. 디스크 용량 매니저 - 어디에 어떻게 데이터를 저장할지를 관리한다. - 디스크의 읽고 쓰기를 제어해 데이터를 영구적으로 저장하는 것을 보조한다. 4. 트랜잭션 매니저 & 락 매니저 - DBMS의 내부의 추상화된 실행 단위인 트랜잭션을 관리해 정합성을 유지하고, - 필요하다면 데이터에 락을 걸어 다른 사람의 요청을 대기시킨다. 5. 리커버리 매니저 - 장애, 혹은 데이터가 손상되었을 때 이를 복구하는 기능을 제공한다. - 백업, 복구 등..

article thumbnail
101. Symmetric Tree
Algorithm 2021. 5. 2. 00:37

Symmetric Tree - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. in-order 접근(실패) class Solution: def isSymmetric(self, root: TreeNode) -> bool: trace = [] def dfs(cur): if not cur: trace.append(None) else: if not (not cur.left and not cur.right): dfs(cur.left) trace.append(cur.v..

Docker 03
Programming 2021. 4. 30. 18:00

어떻게 컨테이너의 변경 사항 및 데이터를 저장할 수 있을까? - 컨테이너는 하나의 프로세스라고 생각할 수 있다. - 프로세스가 완벽히 종료되어 사라지면 프로세스의 데이터도 같이 사라진다. - 이렇게 컨테이너 내부에서 생성되거나 변경된 파일에 대한 데이터를 관리해야 하는 니즈가 있다. - Docker는 Container Layer의 문제점을 개선한 Docker Volumne이라는 기술로 이것을 해결했다. R/W Container Layer - 컨테이너 내에서 생성/변경된 모든 파일을 Read-Write 가능한 Container Layer에 저장한다. - Docker는 Copy-on-Write 방식으로 변경 사항을 관리한다. - 컨테이너는 이미지의 연속된 층인데 컨테이너 자체에서 관리하는 층(R/W laye..