🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 이 문제는 완전 탐색으로 해결할 수 있습니다. 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다. 각 이모티콘의 할인율을 정하고 이에 따라 이모티콘 플러스 가입자 수와 총판매액을 구할 수 있습니다. 따라서 가능한 할인율을 모두 구하고 이 둘이 최대인 값을 구하면 됩니다. DFS, 백트래킹으로 가능한 할인율 순열을 구합니다. private static final int[] RATE = {90, 80, 70, 60}; private void dfs(int[] emoticons, i..
🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 이 문제는 그리디로 문제를 해결할 수 있습니다. 가장 멀리 있는 배달을 갔을 때 가장 멀리 있는 택배 상자를 수거하면 됩니다. 즉, 다음과 같은 전략으로 문제를 해결할 수 있습니다. 1. 배달 및 수거할 택배 상자가 남은 가장 먼 집부터 택배를 배달 및 수거합니다. 2. 트럭이 물류창고에서 출발해 가장 먼 집으로 이동할 때는 배달만 하고, 다시 물류창고로 돌아올 때는 수거만 합니다. 3. 트럭이 물류창고에서 출발할 때 항상 택배를 최대 개수만큼 배달하고, 물류창고로 돌아갈 때 최대 개수만큼 ..
트랜잭션 트랜잭션은 작업의 완전성을 보장해 주는 것이다. 논리적인 작업 셋이 완전히 적용되거나 아무것도 적용되지 않아야 한다. 트랜잭션이 없다면 작업 셋의 일부만 변경되는 Partial update가 발생해 문제가 생길 수 있다. InnoDB 스토리지 엔진은 트랜잭션을 지원하지만 MyISAM이나 MEMORY 스토리지 엔진은 트랜잭션을 지원하지 않는다. AUTO-COMMIT을 활성화하고 MyISAM 테이블과 InnoDB 테이블을 생성 mysql> SET auto-commit=ON; mysql> CREATE TABLE tab_myisam( fdpk INT NOT NULL, PRIMARY KEY (fdpk) ) ENGINE=MyISAM; mysql> CREATE TABLE tab_innodb( fdpk INT..
🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 반환하는 solution 함수를 만들어야 합니다. 오해의 소지가 없도록 모든 달이 28일입니다. 개인정보가 파기일을 지났는지만 확인하면 되므로 년, 월, 일을 일로 바꾸어 계산할 것입니다. 입력 today: 오늘 날짜. "YYYY.MM.DD" 문자열 형태 terms: 약관 종류와 유효기간이 띄어쓰기로 구분된 문자열 privacies: 개인정보 수집 일자, 약관 종류가 띄어쓰기로 구분된 문자열 알고리즘 간단한 구현 문제입니다...
어댑티브 해시 인덱스 InnoDB 스토리지 엔진에서 사용자가 자주 요청하는 데이터에 대해 자동으로 생성하는 인덱스이다. B-Tree 인덱스 VS 어댑티스 해시 인덱스 어댑티브 해시 인덱스는 B-Tree의 검색 시간을 줄여주기 위해 도입되었다. 일반적인 인덱스는 B-Tree로 되어있다. B-Tree는 데이터 탐색을 위해 Root부터 Branch를 거쳐 Leaf까지 탐색을 해야한다. 하지만 해시 인덱스는 데이터를 즉시 찾아갈 수 있다. 해시 인덱스는 인덱스 키 값과 해당 인덱스 키 값이 저장된 데이터 페이지 주소의 쌍으로 관리된다. 인덱스 키 값은 B-Tree 인덱스의 고유 번호와 B-Tree 인덱스의 실제 키 값 조합으로 생성된다. 즉, 모든 B-Tree 인덱스는 하나의 어댑티브 해시 인덱스에 저장되며, ..
언두 로그 InnoDB 스토리지 엔진은 트랜잭션과 격리수준을 보장하기 위해 DML(INSERT, UPDATE, DELETE)로 변경되기 이전 버전의 데이터를 별도로 백업한다. 백업된 데이터를 언두로그(Undo Log)라 한다. 언두로그가 어떻게 사용되는지 간단히 살펴보자. 트랜잭션 보장 트랜잭션이 롤백되면 트랜잭션 도중 변경된 데이터를 변경 전 데이터로 복구해야 한다. 이때 언두 로그를 사용한다. 격리 수준 보장 특정 커넥션에서 데이터를 변경하는 도중 다른 커넥션에서 데이터를 조회하면 트랜잭션 격리 수준에 맞게 변경 중인 레코드를 읽지 않고 언두로그의 데이터를 읽어서 반환한다. 즉, 격리 수준에 따라 보여주는 데이터가 다르다. 언두 로그 모니터링 대용량 데이터 처리 MySQL 5.5 이전 버전에서는 언두..
InnoDB 버퍼 풀 디스크의 파일이나 인덱스 정보를 메모리에 캐시해두는 공간이다. 쓰기 지연을 위한 버퍼로도 사용된다. DML을 통한 데이터 변경은 디스크의 여러 곳에 저장된 레코드를 변경한다. 이는 디스크의 랜덤 I/O를 발생시킨다. 따라서 쓰기 지연을 통해 랜덤 I/O를 줄여 성능을 향샹시킬 수 있다. 데이터 페이지 InnoDB가 디스크와 데이터를 주고 받는 최소 단위를 데이터 페이지라 한다. 데이터 페이지에는 최소 하나의 행이 포함될 수 있다. 하나의 행이 너무 크다면 다음 페이지를 포인터로 쪼개서 데이터 페이지는 전송한다. 구조 InnoDB 버퍼 풀은 메모리 공간을 페이지 단위로 쪼개서 관리한다. 쪼개진 조각을 관리하기 위해 LRU 리스트, Flush 리스트, Free 리스트라는 3개의 자료구조..
InnoDB는 테이블 기반의 잠금이 아닌 레코드 기반의 잠금을 제공한다. 그때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. PK에 의한 클러스터링 InnoDB의 모든 테이블은 PK 값의 순서대로 클러스터링되어 저장된다. 모든 세컨더리 인덱스는 레코드 주소 대신 PK의 값을 논리적인 주소로 사용한다. 테이블이 PK 순서대로 저장되어 있기 때문에 PK를 이용한 레인지 스캔이 상당히 빠르다. 결과적으로 실행계획에서 PK는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정된다. MVCC(Multi Version Concurrency Control) 잠금을 사용하지 않는 일관된 읽기 제공을 위해 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다. InnoDB는 언두 로그를 이용해 이 기능..
쿼리 캐시 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 캐시 데이터를 반환한다. 하지만 테이블의 데이터가 변경되면 캐시에 저장된 데이터 중 변경 사항과 관련된 것들을 모두 삭제해야한다. 이는 심각학 동시 처리 성능 저하를 유발한다. 결국 MySQL 8.0에서부터 쿼리 캐시 기능은 완전히 제거 되었다. 쿼리 파서 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만든다. 쿼리 문장의 기본 문법 오류를 발견하고 오류 메시지를 전달한다. 전처리기 파싱된 쿼리 문장에서 구조적인 문제점을 확인한다. 각 토큰을 테이블 이름이나 칼럼 이름, 내장 함수와 같은 객체를 매핑한다. 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인한다. 실제 존재하지 않거나 권한상 사용할 수 없는 경우 오류가 발생한다. 옵티마이저 쿼..