전체 글

전체 글

    인덱스와 인덱스 스캔

    인덱스 인덱스는 데이터베이스에서 키값으로 실제 데이터 위치를 식별하고 데이터 접근 속도를 높이고자 생성되는, 키 기준으로 정렬된 오브젝트이다. 저장된 데이터를 검색할 일이 많을 때는 인덱스를 설계하고 생성하는 과정이 매우 중요하다. 인덱스는 생성하려는 열의 속성에 따라 고유 인덱스와 비고유 인덱스로 구분할 수 있다. 고유 인덱스 고유 인덱스란 인덱스를 구성하는 열들의 데이터가 유일하다는 의미로, 차례로 정렬되는 인덱스 열의 데이터는 서로 중복되지 않고 유일성을 유지한다. 만약 동일한 데이터가 생성되면 고유 인덱스의 중복 체크 과정에서 에러가 발생한다. 또한, 중복이 없는 열들을 고유 인덱스로 생성하려 한다면 중복이 있는지 검증하는 절차를 거쳐햐 하므로, 불필요한 중복 검증 과정이 추가되므로 주의해야 한다..

    테이블과 키

    테이블 테이블은 데이터를 저장하는 오브젝트로 행과 열의 정보를 저장하며, 관계형 데이터베이스는 2차원 배열 형태로 테이블을 관리합니다. Row 로우는 행에 해당하는 용어로, 테이블에서 동일한 구조의 데이터 항목들의 집합을 가리킵니다. 즉, 행은 하나의 데이터 항목 집합이며 모든 행의 집합은 테이블! 로우 수가 많아지면 데이터에 접근하는 과정에서 시간이 오래 소요될 가능성이 높기 때문에, 파티셔닝 기법으로 SQL 문의 성능 향상을 고려해볼 수도 있습니다. Column 컬럼은 열에 해당하는 용어로, 사전에 정의한 데이터 유형으로 데이터값을 저장합니다. 키 Super Key 각 row를 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합을 말합니다. 유일성 만족 유일성: 하나의 키 값으로 특정 row..

    `DB 엔진과 SQL 수행 프로세스

    SQL 수행 전체 프로세스 사용자가 DB에서 원하는 데이터를 가져오기 위해 SQL 문을 실행한다. 실행된 SQL 문은 MySQL 엔진에서 문법 에러가 있는지, DB에 존재하는 테이블 대상으로 SQL 문을 작성했는지와 같은 세부사항을 다양한 문법 및 구문으로 검사한다. (파서) 사용자가 요청한 데이터를 빠르고 효율적으로 찾아가는 전략적 계획을 수립한다. (옵티마이저) 수립한 계획을 토대로 스토리지 엔진에 위치한 데이터까지 찾아간 뒤 해당 데이터를 MySQL 엔진으로 전달한다. MySQL 엔진은 전달된 데이터에서 불필요한 부분을 필터링하고 필요한 연산을 수행한 뒤 사용자에게 최종 결과를 전달한다. DB 엔진 스토리지 엔진 스토리지 엔진은 사용자가 요청한 SQL 문을 토대로 DB에 저장된 디스크나 메모리에서 ..

    `MySQL과 MariaDB

    MySQL MySQL은 1995년 오픈소스로 배포된 관계형 데이터베이스 관리 시스템으로, 대용량 데이터와 가용성, 안정성을 제공한다. 다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로, 2010년 오라클에 인수되었다. 현재 MySQL8.0 버전까지 배포되었으며 상용 버전과 커뮤니티 버전으로 구분한다. 상용 버전은 오라클에서 다양한 보안 패치와 개선된 기능을 제공하지만, GPL 라이선스를 사용하는 무료 버전은 제약된 기능과 서비스만 사용할 수 있다. MariaDB MySQL이 오라클로 인수되고 나서 개발 지침과 라이선스 정책의 변화에 따라, MySQL의 핵심 개발자 주도로 오픈소스 정책을 지향하는 MariaDB가 탄생했다. MariaDB는 MySQL 소스코드를 기반으로 개발되..

    9996 한국이 그리울 땐 서버에 접속하지

    문제 https://www.acmicpc.net/problem/9996 9996번: 한국이 그리울 땐 서버에 접속하지 총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다. www.acmicpc.net 접근 정규식 사용 풀이 import re n = int(input()) s = input() idx = s.index("*") pattern = s[:idx] + "[a-z]*" + s[idx + 1:] p = re.compile(pattern) for _ in range(n): t = input() if p.fullmatch(t): print("DA") e..

    10165 버스 노선

    문제 https://www.acmicpc.net/problem/10165 10165번: 버스 노선 첫 번째 줄에는 버스 정류소의 개수 N(3 ≤ N ≤ 1,000,000,000)이 주어지고 두 번째 줄에는 버스 노선의 수 M(2 ≤ M ≤ 500,000)이 주어진다. 각 버스 노선은 1부터 M까지의 번호로 구분된다. 그 다음 M개 www.acmicpc.net 접근 문제를 봤을 때 우선 대강 정렬하고 스위핑해서 풀어야겠다고 생각했다. 까다로운 부분이 원형으로 이루어진 버스 노선 처리인데, 카카오 기출 문제 중 원을 두 배 늘려서 직선으로 처리했던게 떠올라서 직선으로 바꾸어 처리했다. 첫 번째 시도에서는 시간초과가 났는데 삭제할 노선을 저장할 때 배열 대신 딕셔너리를 사용했고, 이미 정렬된 상태이기 때문에 ..

    2749 피보나치 수 3

    문제 https://www.acmicpc.net/problem/2749 2749번: 피보나치 수 3 첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 접근 문제에서 주어지는 N의 범위가 매우 크기 때문에, 피보나치 수들에 어떠한 주기가 있을 것으로 판단하고 구글 검색 후 피사노 주기라는 개념을 알게 되었다. 피사노 주기 def) In number theory, the nth Pisano period, written as π(n), is the period with which the sequence of Fibonacci numbers taken modulo n repeats. 즉, 주기를 p라고 했을 때, n번째 피보나..

    21939 문제 추천 시스템 Version 1

    문제 https://www.acmicpc.net/problem/21939 21939번: 문제 추천 시스템 Version 1 tony9402는 최근 깃헙에 코딩테스트 대비 문제를 직접 뽑아서 "문제 번호, 난이도"로 정리해놨다. 깃헙을 이용하여 공부하시는 분들을 위해 새로운 기능을 추가해보려고 한다. 만들려고 하는 명령 www.acmicpc.net 접근 처음 생각한 방법은 딕셔너리에 난이도별로 문제를 저장하려 했으나, 난이도별로 관리할 필요가 없다는 생각이 들어서 우선순위큐로 바꿨다. 가장 어려운 문제와 가장 쉬운 문제를 추천해야 하므로 우선순위큐 2개를 사용했고, 푼 문제들을 저장하기 위해 딕셔너리를 사용했다. solve 연산을 수행할 때마다 저장된 문제를 갱신하는 방법으로 풀었으나 시간초과가 발생해서 ..

    13334 철로

    문제 https://www.acmicpc.net/problem/13334 13334번: 철로 입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0 www.acmicpc.net 접근 가장 처음 시도한 방법은 정렬과 스위핑을 사용해서 철도의 구간과 구간에 들어가는 경로의 개수를 갱신해나가는 방법으로 풀이했으나 틀림 -> 반례가 무엇인지 못찾겠다... 다른 방법으로 정렬된 전체 경로들(시작점과 끝점이 철도의 길이 d보다 작거나 같은 경로들)에 대해, 철도의 길이 d에 함께 포함될 수 있는 경로들을 따로 저장(q)해놓고..