기본 개념용어 의미event사용자 행동이나 시스템 사건 (click, mouseover 등)event source이벤트가 발생한 HTML 요소 (버튼, 입력창 등)event handler이벤트 발생 시 실행될 함수 (callback)event listenersource에서 이벤트를 감지하고 handler를 연결하는 매커니즘흐름 이해사용자가 버튼 클릭 ↓event source (버튼)가 "click" 이벤트 감지 ↓event listener가 handler 호출 ↓handler 함수 실행 (원하는 동작 수행)코드로 보면:addEventListener("click", event_handler)// 이벤트타입 핸들러함수Event Listener 등록 방식 3가지1...
투포인터(Two Pointer) 알고리즘 — 왜 모든 경우를 탐색할 수 있는가?투포인터는 배열에서 조건을 만족하는 쌍이나 구간을 O(n)에 찾는 기법이다.핵심 질문은 하나다. 포인터를 이동할 때 정답을 건너뛰지 않는다는 게 어떻게 보장되는가?종류 1 — 양 끝에서 출발하는 투포인터언제 쓰나?정렬된 배열에서 두 원소의 합이 x인 쌍을 찾을 때.정렬: 1 2 3 5 7 9 10 11 12, x = 13 ↑ ↑ l r왜 양 끝에서 시작하는가?양 끝이 가능한 합의 전체 범위를 커버하는 유일한 출발점이기 때문이다.l=0, r=n-1 에서 시작해야 모든 원소가 탐색 대상에 포함된다.만약 가운데서 시작하면 왼쪽 또는 오른쪽 원소들이 영영..
https://postgrespro.com/blog/pgsql/4261647 Indexes in PostgreSQL — 7 (GIN)We have already got acquainted with PostgreSQL indexing engine and the interface of access methods and discussed hash indexes , B-trees , as well as GiST and SP-GiST indexes. And this article will feature GIN index. GIN "Gin?.. Gin is, it seems, such an Ampostgrespro.com PostgreSQL을 쓰다 보면 B-Tree 인덱스로는 해결되지 않는 복합 데이터(배열, JS..
개발하다 보면 쿼리 속도가 느려지는 시점이 반드시 온다. 이때 가장 먼저 고려해야 할 튜닝 포인트가 바로 인덱스(Index)다. 오늘은 면접 단골 질문이기도 한 인덱스의 자료구조부터 효율적인 설계 방법까지 정리해 본다.1. 인덱스(Index)란?인덱스는 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하는 대신, 데이터의 읽기(SELECT) 속도를 획기적으로 높여주는 자료구조다.쉽게 비유하자면 책의 '맨 뒤에 있는 찾아보기(색인)'와 같다.두꺼운 전공 서적에서 특정 단어를 찾을 때, 첫 페이지부터 끝까지 훑는 것(Full Table Scan)보다 뒤편의 색인을 보고 바로 해당 페이지를 펼치는 게 훨씬 빠른 것과 같은 원리다.핵심 요약장점: 조회 속도(SELECT) 향상, 시스템 부하 ..
현재 크롤링을 잔뜩 하는 프로젝트가 이상하게ec2에서만 터진다. 그 이유를 찾아보자니 크롤링을 너무 많이 하기 때문에 스레드를 너무 많이 사용해서 서버에 과부화가 온다는 것이다.이를 해결하기 위해서 코어와 스레드가 어떻게 관련있는지와 어떻게 설정해야되는지 알아보자. 물리코어와 논리코어 그리고 스레드 CPU에서 코어와 스레드의 개념 및 갯수의 의미에 대해 알아본다. CPU 사양의 의미 CPU 스펙표에서 흔히 볼 수 있는 2Core 4Thread, 4Core 8Thread 등의 표기는 해당 CPU가 가진 물리적 연산 장치(코어)와 논리적 실행 단위(스레드)의 개수를 의미한다 CPU의 사양을 살펴 보면, 보통 CPU의 코어와 스레드는 2Core 4Thread, 4Core 4Thread, 8Core 16..
API 아키텍처 및 프로토콜1. REST (Representational State Transfer)개요: 웹에서 가장 널리 사용되는 아키텍처 스타일로, 자원(Resource)을 URI(Uniform Resource Identifier)로 표현하고 해당 자원에 대한 행위를 HTTP 메서드(GET, POST, PUT, DELETE 등)로 정의합니다.동작 방식:클라이언트는 특정 자원을 나타내는 URI(예: /users/123)와 원하는 행위를 나타내는 HTTP 메서드(예: GET)를 조합하여 서버에 요청을 보냅니다.서버는 해당 요청을 수신하여, URI와 메서드에 맞는 비즈니스 로직을 실행합니다.처리가 완료되면, 서버는 상태 코드(예: 200 OK)와 함께 요청된 자원의 현재 상태(표현)를 JSON이나 XML..
1. N 의 범위 를 확인한다. N ≤ 20: O(2N), O(N!) -> 비트마스킹 DP, 백트래킹, 완전 탐색N ≤ 1,000: O(N2), O(N2logN) -> 이중 for문, 플로이드-워셜N ≤ 100,000: O(NlogN), O(N) -> 정렬, 이분 탐색, 세그먼트 트리, 투 포인터N ≥ 1,000,000: O(N), O(logN) -> 선형 탐색, 이분 탐색 2. 브루트포스로 풀리는지 확인한다. 3단계: 특정 알고리즘 적용 고려 * 정렬 (Sorting) + α 그리디 (Greedy)그리디는 중간 과정이 생략 가능한지(지역적 최적이 전역적 최적으로 이어지는지) 확인한다DP (Dynamic Programming)DP는 한 상태가 다른 상태를 유발하는지(부분 문제의 해가 전체 문제의 ..
import java.util.*;class Node { int id, score; Node(int id, int score) { this.id = id; this.score = score; }}public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add(new Node(1, 80)); list.add(new Node(2, 95)); list.add(new Node(3, 80)); // 1. 익명 클래스 방식 (가장 정석적인 형태) Collections.sort(list, new Comparator(..
https://www.acmicpc.net/problem/10330 #문제 간단 정리 그리디 알고리즘 #문제 해결 방법 정답은 두가지 경우가 될 수 있다두가지 경우의 정답을 일단 만들어준 뒤에1을 기준으로 정답의 1과 서로 짝지어주면된다이때 짝지어주는 거리를 더해주면 정답이 된다1 1 1 0 0 0 0| | || | -- +4 ---| -- +4 --- |-- +4 --- | | | | |0 0 0 0 1 1 1다음과같이 짝지어주는 코드를 구현해주면된다 #전체 코드 #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typed..
#문제 간단 정리 배낭 DP 문제 #문제 해결 방법 딱히 특별할 풀이랄게 없다 배낭문제인데 DP는 최대 배낭사이즈로 해주고 각 배낭들의 효율성만 비교해주면된다. 1차원배열로 풀었지만 2차원 배열로 풀어도 딱히 메모리초과는 안날 것 같으니 쉬운 문제인 듯하다. #전체 코드#include #include #include #include #include #include using namespace std;typedef long long ll;typedef long double ld;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; //무게,가치 vector> items(n);..
서론 dp에서는 중복부분문제와 최적부문구조가 동시에 가능해야 DP 문제로 풀 수 있다.중복 부분 문제 (Overlapping Subproblems):동일한 하위 문제를 여러 번 반복해서 푸는 특성최적 부분 구조 (Optimal Substructure):문제를 작은 하위 문제들로 나누어 해결할 수 있고, 각 하위 문제의 최적해를 결합하여 전체 문제의 최적해를 구성할 수 있는 특성 그럼 여기서 의문이 하나 생길수도 있는데중복부분문제라면 하위문제를 여러번 풀어야되는 문제라면 그 전의 최적부분 구조도 자연스럽게 따라오지않을까? 하지만 그렇지 않다 1. 중복되는 부분 문제 (Overlapping Subproblems) - 효율성의 문제이것은 큰 문제를 작은 문제로 나누었을 때, 같은 작은 문제가 반복적으..
애플리케이션 계층: 메시지 (Message)사용자가 직접 접하는 데이터의 원형입니다.전송 계층: 세그먼트 (Segment) / 데이터그램 (Datagram)TCP에서는 세그먼트, UDP에서는 데이터그램이라고 부릅니다.신뢰성 있는 연결을 위해 데이터를 조각낸 단위입니다.인터넷(네트워크) 계층: 패킷 (Packet)IP 주소 등 목적지를 찾아가기 위한 정보가 담긴 단위입니다.링크 계층: 프레임 (Frame) / 비트 (Bit)데이터 링크 계층에서는 프레임이라고 부르며, 물리적 주소(MAC) 정보가 담깁니다.물리 계층에서는 이 모든 것을 0과 1의 전기 신호인 비트로 변환하여 전송합니다. TCP 3-Way Handshake (연결 수립)Client → Server: SYN클라이언트가 서버에 SYN 패킷을 전..
#전체 구조 스프링 mvc 전체구조이다 하나식 정리해보도록 하자 #1.Dispatcher Servlet HTTP 요청이 오게되면내장 톰켓 서버에서 이를 받아서 HttpServletRequest 객체와 HttpServletResponse 로 생성해서 Dispatcher Servlet에 전달한다 이를 대응되는 response를 만들어서 서블릿을 실행시키고response로 다시 반환하는데 여기서 서블릿은 싱글톤으로 하나만 생성된다. Spring MVC의 프론트 컨트롤러 역할이다 MVC와같은 프론트 컨트롤러 코드 package hello.servlet.web.frontcontroller.v5;import hello.servlet.web.frontcontroller.ModelView; import hell..
https://www.acmicpc.net/problem/25421 #문제 간단 정리 DP #문제 해결 방법 지시대로만 하면 해결되는 간단한 DP i = ( 1~n) j = (1~9) k = (1~9) dp[i][j] = i 자리수의 j로 끝나는 조건을만족하는 수 dp[i][j] += dp[i-1][k] j와 k의차이 절대값 2 이하 3중반복이지만 범위가 크지않아 돌아간다#전체 코드#include #include #include #include #include #include using namespace std;typedef long long ll;const int mod = 987'654'321;int main() { ios::sync_with_stdio(false); cin.t..
https://www.acmicpc.net/problem/13913] #문제 간단 정리bfs + 역추적 #문제 해결 방법 bfs에 방문배열 ( 이전 노드를기록) 사용해서 풀자 #전체 코드#include #include #include #include #include #include using namespace std;int visited[100'002];queue q;void progress(int next,int now) { if (next >= 0 && next > n >> k; if (n == k) { cout ans; ans.push_back(k); int path = visited[k]; while (path ..
#문제 간단 정리 DP #문제 해결 방법 우선 시간복잡도를 보면 브루트포슨은 당연히 안되고그리디 or DP가 가능한데그리디는 생각보다 너무 전략이 복잡함으로 DP로 생각이 넘어가는데 보면 7의 배수라는 점에 주의해서 생각해보면항상 7로 나머지만 잘 신경써주면 된다즉 매 단계마다 7로 나누기를 해주면 0~6에서의 나머지가나오고이전단계의 나머지에서 현재 선택의 결과를 적용해서 7의 배수가 되는지 확인하면 된다/dp[i][j] i번쨰 단계에서 k를 나눴을때 j가 나올수 있는가 (j = 0~6)의 점화식으로 계산해주면 된다 . 여기서 우리는 나머지만 사용해서 상태를 관리해도 되는지 의문이 생길수도 있는데더하기는 우리가 항상 나머지만 보더라도 어짜피 나중에 7로 나눌걸 미리 나눌 뿐이니 괜찮다는걸 쉽게 생각 할..
https://www.acmicpc.net/problem/25307 #문제 간단 정리 최단거리탐색 bfs지만 시간초과를 신경써야된다 #문제 해결 방법2000* 2000 크기의 보드기때문에 4백만정도의 크기인데 최대마네킹도 4백만개가 존재할수 있다 때문에 bfs 한칸이동하면서 마네킹 4백만개를 채크한다면 4백만 * 4백만으로 어림도없는 시간복잡도임을 확인 가능하다 때문에 마네킹을 한번에 큐에 넣어서 피해야되는 영역을 bfs로 확인하는 것이다 #전체 코드#include #include #include #include #include using namespace std;vector> board;vector> visited;int n, m,k;int dy[4] = { -1,0,1,0 };int dx[4] =..
#문제 간단 정리 다이나믹 프로그래밍 + LIS활용 #문제 해결 방법 문제 서술이 조금 복잡하게 되어있지만 결국에 그 문제번호가 포함해서 가장 긴 부분수열 ( 난이도 증가) 를 알고싶다는 것이다. 기존의 LIS dp는 2중반복문을 사용했을때 dp[i] 에는 난이도증가하는 가장 긴부분수열이저장된다때문에 반대로 난이도가 하락하는 부분수열을 dp2[i]로 구해준뒤에두개를 더해주면 된다 LIS 를 잘 기억하고있으면 쉽게 응용해서 풀 수 있다. #전체 코드#include #include #include #include #include #include #include using namespace std;typedef long long ll;int n, q;int main() { ios::sync_with_..
https://www.acmicpc.net/problem/5588#문제 간단 정리 브루트 포스 문제 #문제 해결 방법 우선 m이 200 n 이 1000이라서 브루트포스가 가능한게 눈에 보인다 우리가 찾고있는 별자리의 첫번째 값을 우리가 가지고 있는 별자리에 (사진 속) 모두 차이를 구하면그중에 하나는 정답이 있을 것이다. 때문에 그 차이값들을 전부 찾고있는 별자리에 더해줘서사진속에 전부 존재하는지 확인해 주면된다. #전체 코드#include #include #include #include #include #include #include using namespace std;typedef long long ll;vector> ori_star;set>my_star;vector> diff;bool findM..
#문제 간단 정리 브루트 포스인데 전처리를 해주자 dp개념도 좀 들어간다고 할 수 있을 것 같 #문제 해결 방법 우선 키 포인트가 되는 아이디어는최대 4개의 제곱수를 만들고입력은 2^15 정도가 들어오니즉 2^15 약(40000) 이하를 만드는 것인데200^2 는 40000 이니까 ㅁ + ㅁ + ㅁ + ㅁ이런 각자리수의 제곱에최대 200까지만 들어올 수 있다는 것이다.때문에각각 (1~200) ^ 2 로 전처리를 해주면된다시간복잡도는 약 200 * 4 정도니 충분하다. #전체 코드#include #include #include #include #include #include #include using namespace std;typedef long long ll;vector dp;void dfs(int l..