전체 글 111

프로그래머스 단어변환

문제 : https://programmers.co.kr/learn/courses/30/lessons/43163 코딩테스트 연습 - 단어 변환 두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수 programmers.co.kr 풀이 : ① DFS를 이용핸 도달할 수 있는 모든 경로를 탐색. ② 탐색 한 경로의 최소값을 출력 2021.09.19 - [알고리즘/알고리즘] - 깊이 우선 탐색 Depth-first search 깊이 우선 탐색 Depth-first search 깊이 우선 탐색 시작 노드와 직접 연관된 하위 노드 끝까지 모두 ..

프로그래머스 네트워크

문제 : https://programmers.co.kr/learn/courses/30/lessons/43162 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있 programmers.co.kr 풀이 : BFS를 이용해 지점을 잇는 경로를 탐색 ① 지점을 잇는 경로를 탐색한다. ② ①에서 탐색되지 않은 지점를 시작으로 재탐색한다. * computer[i][i] 가 1이므로, 어느 지점과 연결되지 않으면 자기자신하고만 연결되는 경로 (네트워크) 1개가 세어진다. 2021.09.19 - [알고리즘/알고리즘] - 너비 우선 탐색 Breath-f..

리트코드 leetCode 705. Design HashSet

문제 : 해쉬 셋 구현하기 Design HashSet - LeetCode Design HashSet - 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 구현 JAVA class MyHashSet { int[] set; public MyHashSet() { set = new int[1000001]; } public void add(int key) { set[key] = 1; } public void remove(int key) { set[key] = 0; } pub..

해시 알고리즘 Hash Algorithm

해슁/해싱 Hashing key K를 해시함수값인 h(K)의 위치에 저장하는 자료구조. Direct-Address 테이블에서의 공간 낭비를 줄이면서도, 시간복잡도를 낮추기 위해서 사용하지만 충돌문제가 있으며 이를 해결하기 위한 Chained Hash Table은 시간이 느려질 수 있음. 충돌 다른 Key K인데 해시함수값인 h(K)가 동일한 경우 체인을 이용한 충돌 해결법 중복되는 Key값이 있을 경우 해당 슬롯을 연결리스트로 저장한다. 수행시간 최악의 경우 : O(N) - 모든 Key 값 K가 하나의 해쉬함수 값를 갖는 경우 - 모든 Key 값이 하나의 연결리스트에 저장된 경우 평균의 경우 : O(1+a) - a는 적재율 = 윈소의 개수 / 슬롯(버킷)의 개수 좋은 해쉬 함수란? key가 중복없이 m개..

MySQL : Foreign keys are not yet supported in conjunction with partitioning

테이블 파티셔닝을 처리하려고 할 때 FK가 있으면 발생하는 에러입니다. FK 제약조건을 삭제 후 파티셔닝을 수행하면 됩니다. [fk 제약조건 삭제] SHOW CREATE TABLE SALARIES; ALTER TABLE SALARIES DROP CONSTRAINT salaries_ibfk_1 ; 파티셔닝 수행 후 FK 제약조건 추가 ALTER TABLE SALARIES ADD CONSTRAINT salaries_ibfk_1 foreign key(emp_no) references employees (emp_no) on update cascade ;

기타/에러처리 2021.10.11

MySQL 튜닝 : 대량 데이터 수정/삽입 시 인덱스 제거

인덱스가 있는 테이블에 대량의 데이터를 수정하거나 삽입하게 되면 인덱스도 모두 수정 및 생성하게 되어 속도가 느려집니다. 다음은 인덱스가 있는 테이블에 2만건의 샘플 데이터를 넣는 쿼리문입니다. DROP TABLE IF EXISTS t; -- 테이블 생성 CREATE TABLE T ( ID INT PRIMARY KEY, A INT, B INT, C INT, TYPE CHAR(2) ); -- 인덱스 생성 CREATE INDEX IDX_1 ON T(TYPE, B,A); DROP PROCEDURE IF EXISTS INSERTDATA; -- 프로시저 생성 DELIMITER $$ CREATE PROCEDURE INSERTDATA() BEGIN DECLARE id INT; DECLARE type CHAR; SET..

DB/SQL 2021.10.11

MySQL 튜닝 : 적합한 인덱스 생성하기

Case 1 : 적합한 인덱스가 없을 때 다음은 이름이 Badri 인 사원을 검색하는 쿼리입니다. 먼저 적합한 인덱스가 없어 테이블 전체 299335건을 탐색했습니다(type : ALL). 그리고 나서 where 조건을 이용해10%만 걸러내었습니다. ( filtered : 10.00, Extra Using where) SELECT E.EMP_NO FROM employees E WHERE E.FIRST_NAME = 'Badri'; 실제 저 쿼리 결과로 검색되는 데이터의 건수는 227건입니다. 전체 중 227건을 추출하기 위해 테이블 전체를 스캔하는 것은 비효율적입니다. 그래서 first_name을 구성 칼럼으로 가지는 인덱스를 추가해주었습니다. alter table employees add index id..

DB/SQL 2021.10.11

MySQL 튜닝 : 인라인 뷰 데이터 줄이기

다음의 쿼리는 직원번호가 10000이상 20000사이인 직원의 최대, 최소, 평균 봉급을 가져오는 쿼리문입니다. 인라인 뷰 SS는 모든 직원의 최소, 최대, 평균 봉급을 구한 값을 저장한 임시 테이블입니다. 그리고 임시테이블과 EMPLOYEES 테이블을 조인하면서 직원번호가 10000이상 20000사이인 직원을 골라내고 있습니다. SELECT E.EMP_NO, SS.MAX_SAL, SS.MIN_SAL, SS.AVG_SAL FROM EMPLOYEES E, ( SELECT S.EMP_NO, MAX(S.SALARY) AS MAX_SAL, MIN(S.SALARY) AS MIN_SAL, AVG(S.SALARY) AS AVG_SAL FROM salaries S GROUP BY S.EMP_NO) SS WHERE E...

DB/SQL 2021.10.10

MySQL 조인 JOIN 튜닝 : 불필요한 조인을 EXISTS로 바꾸기

다음의 쿼리는 TITLE이 ENGINEER인 적이 있었던 직원을 가져오기 위한 쿼리입니다. TITLE이 ENGINEER라고 되어있는 기록과 직원 테이블을 JOIN하여 구하고 있습니다. [튜닝 전] SELECT DISTINCT E.EMP_NO, E.FIRST_NAME, E.LAST_NAME FROM EMPLOYEES E, (SELECT T.EMP_NO FROM TITLES T WHERE TITLE = 'Engineer') T WHERE E.EMP_NO = T.EMP_NO; 수행시간 : 1.344 sec / 0.063 sec COST : 'Last_query_cost', '82168.779876' [ 튜닝 후] JOIN을 수행할 필요없이 ENGINEER 였던 적이 존재하는 지 여부만 구하면 되기 때문에 JO..

DB/SQL 2021.10.10

MySQL 쿼리 정리

테스트 데이터 만들기 테이블 생성 CREATE TABLE CREATE TABLE T ( ID INT PRIMARY KEY, A INT, B INT, C INT, TYPE CHAR(2) ); 인덱스 생성 CREATE INDEX CREATE INDEX IDX_1 ON T(B,A); PL/SQL로 데이터 만들기 DELIMITER $$ -- 프로시저 INSERTDATA 선언 시작 CREATE PROCEDURE INSERTDATA() BEGIN DECLARE id INT; -- 증가 변수 ID 선언 SET id = 1;-- 변수 ID의 초기값 선언 WHILE id < 100 DO -- 변수 ID의 값이 100보다 작은 경우 루프 실행 INSERT T VALUES( id, id/10, id/100, id/1000,..

DB/SQL 2021.10.10