CS 133

[2023 KAKAO BLIND RECRUITMENT] 개인정보 수집 유효기간

https://school.programmers.co.kr/learn/courses/30/lessons/150370 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 단순 구현문제이고 레벨 1 문제인데 살짝 헤맸다.. 다른 건 다 간단하고, 주의할 점은 년, 월, 일에 n달을 더하고 비교하는 건데 이를 쉽게 하기 위해 모든 날짜를 일로 변환하면 된다(모든 달은 28일까지 있다고 가정하기 때문에 이렇게 해도 된다). 즉 2022년 1월 1일은 (2022 * 12 * 28) + (1 * 28) + (1)일인 것이다! import java.util.*; // 파기..

CS/Algorism 2024.02.27

[Real MySQL] 4.아키텍처 - InnoDB 스토리지 엔진 아키텍처

InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. InnoDB의 구조는 다음과 같다. PK에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 PK를 기준으로 클러스터링되어 저장된다. 즉, PK의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 PK를 논리적인 주소로 사용한다. PK가 클러스터링 인덱스이기 때문에 PK를 이용한 레인지 스캔은 상당히 빠르게 처리될 수 있다. 따라서 쿼리 실행 계획에서 PK는 기본적으로 다른 보조 인덱스에 비해 비중 높게 설정된다. (쿼리 실행 계획에서 다른 보조 인덱스보다 PK가 선택될 확률이 높다.) InnoDB ..

CS/Database 2024.02.26

[Real MySQL] 4. 아키텍처 - MySQL 엔진 아키텍처

MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다. (MySQL 서버 = MySQL 엔진 + 스토리지 엔진) MySQL 엔진은 클라이언트로부터 오는 요청 처리를 담당하고(SQL 분석, 최적화 등), 스토리지 엔진은 실제 데이터를 디스크에 저장하거나 조회하는 부분을 말한다. MySQL 엔진 커넥션 핸들러: 클라이언트와의 접속(커넥션), 그리고 쿼리 요청 처리를 담당한다. SQL 인터페이스: DML, DDL, Procedure, View 등 SQL 인터페이스 제공을 담당한다. SQL 파서: 클라이언트가 보낸 SQL에 문법 오류가 있나 확인하고, MySQL이 처리하기 좋은 토큰 단위로 나눠서 트리 형태로 파싱한다. SQL 옵티마이저: 쿼리의 최적화된 실행을 담당한다. 캐시와 버퍼: 성..

CS/Database 2024.02.26

[2022 KAKAO TECH INTERNSHIP] 등산코스 정하기

https://school.programmers.co.kr/learn/courses/30/lessons/118669 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 출입구를 A, 산봉우리를 B라고 할 때, A -> ... -> B -> ... -> A의 경로로 이동한다. 그리고 가장 작은 intensity를 구하면 된다. 이때 출입구 A -> 산봉우리 B로 이동할 때의 최소 intensity만 구하면 된다. B -> A에서의 최소 intensity는 A -> B로 올라온 경로로 똑같이 내려가면 되기 때문이다. 이렇게 생각하면 별도의 중복 처리 없이 등산코스..

CS/Algorism 2024.02.13

공유 락/배타 락과 데드락

공유 락(Shared Lock)과 배타 락(Exclusive Lock) 공유 락(읽기 락) 공유 락이 걸린 데이터는 다른 트랜잭션에서 읽기만 가능하고 쓰기는 불가능하다. 즉, 공유 락이 걸린 데이터에 대해서 다른 트랜잭션도 똑같이 공유 락을 획득할 수 있다. 단, 배타 락은 획득할 수 없다. 따라서 공유 락을 사용하여 조회한 데이터는 트랜잭션 내내 변경되지 않음이 보장된다. 배타 락(쓰기 락) 배타 락이 걸린 데이터는 다른 트랜잭션에서 읽기와 쓰기 모두 불가능하다. 즉, 배타 락이 걸린 데이터에 대해서 다른 트랜잭션은 공유 락, 배타 락 둘 다 획득할 수 없다. 즉, 배타 락을 획득한 트랜잭션은 해당 데이터에 대한 독점권을 갖는 것이다. 정리해보면 아래 표와 같이 배타 락이 개입하는 경우 양립이 불가능해..

CS/Database 2024.02.09

[백준] 2212. 센서

https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 그리디 문제로, 2가지 방법으로 풀 수 있다. 방법 1: N = 6, K = 2일 때 각 센서 간의 거리들 중 4(N - K)개가 수신 영역이다. 이때 최소한의 수신 영역을 구해야하므로 센서 간의 거리를 오름차순해서 앞에 4개를 더한 것이 답이 된다. import java.io.BufferedReader; import java.io.IOException; import ja..

CS/Algorism 2024.02.08

MySQL의 MVCC(Multi Version Concurrency Control)

MVCC의 가장 큰 목적은 잠금(락)을 사용하지 않는 일관된 읽기를 제공하는 데 있다. 그리고 InnoDB는 언두 로그(Undo log)를 통해 이 기능을 구현한다. 예제를 통해 MVCC가 어떻게 동작하는지 알아보자. 만약 트랜잭션 1이 데이터를 조회해와서 값을 변경("서울" -> "경기")했으며 아직 커밋하지 않은 상태라고 가정하자. 데이터를 변경하면, 커밋 여부와 상관없이 InnoDB 버퍼 풀에 변경된 데이터가 반영된다. 그리고 변경 전의 데이터는 언두 영역에 보관된다. 이때 트랜잭션 2가 해당 데이터를 조회하면 어떤 데이터가 조회될까? 이는 설정한 트랜잭션 격리 수준에 따라 다르다. READ_UNCOMMITTED: InnoDB 버퍼 풀이 현재 가지고 있는 변경된 데이터("경기")를 반환한다. REA..

CS/Database 2024.02.07

[백준] 1525. 퍼즐

https://www.acmicpc.net/problem/1525 1525번: 퍼즐 세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다. www.acmicpc.net 퍼즐에서 0의 위치를 찾아서 4방향(위, 아래, 왼쪽, 오른쪽)으로 bfs를 진행하면 된다. 그런데 해당 퍼즐을 이미 만들었다면 패스하는 로직을 작성해야 한다. 이때 이차원 배열로 비교하면 복잡하기 때문에 다음과 같이 문자열로 변경해서 생각하면 된다. 1 2 3 4 5 6 7 8 0 ➡️ 123456780 그리고 방문 여부뿐만 아니라 몇 번만에 해당 퍼즐을 만들었는지 저장해주어야 하는데 map을 사용하면 방문 여부와 횟수를 간편하게 저장할 수 있다. map의 key는 중복이..

CS/Algorism 2024.02.06

[백준] 5014. 스타트링크

https://www.acmicpc.net/problem/5014 5014번: 스타트링크 첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다. www.acmicpc.net 평소 많이 풀던 BFS 문제에서 4방향 탐색을 2방향 탐색으로 바꾸기만 하면 된다. 그런데 다음과 같은 치명적인 실수를 해서 틀렸다. BFS를 풀 때 다음과 같이 그래프 범위 밖을 벗어나거나 이미 방문했으면 continue해버렸다. while (!que.isEmpty()) { Integer num = que.poll(); // 도착한 경우 if (num == G) { System.out.println(map[..

CS/Algorism 2024.02.05

[백준] 1987. 알파벳

https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 $R$칸, 가로 $C$칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 ($1$행 $1$열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 www.acmicpc.net 처음에는 set을 사용해서 매 경우마다 set을 clone하고 새로운 알파벳을 넣어주는 식으로 풀었다. 그런데 시간초과가 났다. 아무래도 매번 컬렉션을 복제하는 것이 시간이 많이 소요되는 거 같다. 따라서 set이 아니라, 알파벳을 담는 일차원 배열을 두면 된다. 즉, visited[] 배열을 두어서 A를 방문했으면 visited[0] = true로 값을 넣어주는 식으로 하면 된다. ..

CS/Algorism 2024.02.02