반응형
자료구조 & 알고리즘
1. 완전 탐색
- 15651번. N과 M (3)
- 중복순열 : 중복을 허용해서 순서 있게 나열하기
- 15649번. N과 M (1)
- 순열 : 중복없이 순서 있게 나열하기
- 155652번. N과 M (4)
- 중복조합 : 중복을 허용해서 고르기
- 15650번. N과 M (2)
- 조합 : 중복없이 고르기
- 14888번. 연산자 끼워넣기
- 9663번. N-Queen
연습문제
- 1182번. 부분수열의 합
- 1795번. 암호 만들기
- 13663번. N과 M (9)
2. 정렬
- 특성
- 같은 정보들은 입접해 있다.
- 각 원소마다, 가장 가까운 원소는 자신의 양 옆 중에 있다.
- N개의 원소를 정렬하는 것은 O(NlogN)의 시간 복잡도를 가진다.
- 기본 자료형 정렬 - Dual-Pivot Quick Sort : in-place
- 정렬 과정에서 N에 비해 충분히 무시할만한 메모리만 추가로 사용한다.
- 1부터 N까지 사용한다면, 동등한 위상의 원소들의 순서관계를 보장하지 않으므로,
- Arrays.sort(a, 1, N+1)을 이용해 정렬을 수행해야한다.
- 객체 정렬 - Time Sort :stable
- 동등한 위상의 원소들의 순서 관계가 보장된다.
기본 문제
- 10825번. 국영수
- 1015번. 수열 정렬
- 11652번. 카드
- 15970번. 화살표 그리기
연습문제
- 1181번. 단어 정렬
- 20291번. 파일 정리
3. 이분 탐색
정렬이 되어있지 않은 수열과 탐색 대상 X가 갖는 질문 - O(N)
- X가 존재하는가
- X[이하, 이상, 초과]의 원소는 몇개가 있는가
- X랑 가장 가까운 원소는 무엇인가
정렬이 되어 있는 수열과 탐색 대상 X가 갖는 질문 - O(logN)
- 이분 탐색으로 같은 질문을 더 빠르게 해결할 수 있다.
이분 탐색 구현을 위한 변수
- L := 탐색할 가치가 있는 범위의 왼쪽 끝 인덱스
- R := 탐색할 가치가 있는 범위의 오른쪽 끝 인덱스
- Result := 탐색한 X의 위치
- 탐색 목표 := X이하의 원소 중에 가장 오른쪽에 있는 원소
- L=1, R=9, M=(L+R)/2=5 -> A[M]과 X를 비교
- L<=R이면 계속 반복, 즉 L>R이면 종료
- A[M]<X -> L = M+1=6, R=9
- A[M]>=X -> L=1, R = M-1=4;
- N이 10만일 때, 10만과 16으로 시간 복잡도의 엄청난 차이가 존재하게 된다.
이분 탐색 주의 할점
- 정렬하지 않는 경우
- L, R, M, Result를 사용해 부등호를 잘못 사용하는 경우
- L, R의 범위를 잘못 설정하거나, Result의 초기값을 잘못 설정하는 경우
기본 문제
- 7795번. 먹을 것인가 먹힐 것인가
- 2470번. 두 용액
연습 문제
- 1920번. 수 찾기
- 1764번. 듣보잡
- 3273번. 두 수의 합
- 10816번. 숫자 카드 2
이분 탐색의 아이디어 - 매개변수 탐색
- 매개변수를 만들기
- 만든 매개변수로 문제에 해당하는 YES/NO 조건 만들 수 있는가?
- 정렬된 상태인지 확인하고 정렬이 필요하면 정렬한다.
- 바꾼 문제가 더 풀기 쉬우면, 매개변수 탐색 수행해서 해결
- 정렬하고, 매개변수를 정렬했으니까 왼쪽부터 차례대로 결정하고, 이분탐색한다.
- O(NlogN), O(N), O(logX) = O(NlogN+NlogX)
기본 문제와 해당하는 연습 문제
- 2805번. 나무 자르기
- 1654번. 랜선 자르기
- 2512번. 예산
- 2110번. 공유기 설치
- 2343번. 기타 레슨
- 6236번. 용돈 관리
- 13702번. 이상한 술집
- 17266번. 어두운 굴다리
Advancedㅊ
- 1300번. K번째 수
- 1637번. 날카로운 눈
4. 두 포인터
- 정답을 찾기 위해 찾는 영역(or 과정)을 줄일 수 없을까?
- 필요한 부분만 (or 빠르게) 탐색
- 정답을 찾기 위해 탐색해야하는 영역을 줄여서 꼭 필요한 부분만 탐색하도록 하자.
- 부분합
- 두 용액
- List of Unique Numbers
- 좋다
- 고냥이
연습문제
- 수들의 합 2
- 수열
- 귀여운 라이언
- 배열 합치기
- 수 고르기
- 두 수의 합
- 세 용액
5. 그래프 탐색 (DFS & BFS)
인프런
기초 (재귀함수, 트리, 그래프)
- 재귀함수 (스택프레임)
- 이진수 출력 (재귀 함수)
- 팩토리얼
- 피보나치 재귀 (메모이제이션)
- 이진트리 순회 (DFS)
- 부분집합 구하기 (DFS)
- 이진트리 레벨탐색 (BFS)
- 송아지 찾기1 (BFS)
- Tree의 말단 노드까지 가장 짧은 경로 (DFS)
- Tree의 말단 노드까지 가장 짧은 경로 (BFS)
- 그래프와 인접 행렬
- 경로탐색 (DFS)
- 경로탐색 (인접리스트)
- 그래프 최단 거리 (BFS)심화
백준
- 기본 구현
- 1260번. DFS와 BFS
- 격자형 그래프
- 2667번. 단지번호 붙이기
- 1012번. 유기농 배추
- 11724번. 연결 요소의 개수
- 4963번. 섬의 개수
- 3184번. 양
- 일반 그래프
- 2606번. 바이러스
- 11403번. 경로 찾기
- 11725번. 트리의 부모 찾기
- 13023번. N명의 친구
- 그래프로 만들기
- 2251번. 물통
- 1697번. 숨바꼭질
- 1389번. 케빈 베이컨의 6단계 법칙
- 5567번. 결혼식
- 멀터 소스 BFS (시작점이 여러개인 BFS)
- 14502번. 연구소
- 최소 이동 거리 BFS
- 2178번. 미로 탐색
- 7562번. 나이트의 이동
- 2644번. 촌수 계산
- 18404번. 현명한 나이트
- 더블 BFS
- 3055번. 탈출 (멀티소스 BFS이기도 함)
- 7569번. 토마토
6. 트리
키워드
- 두 정점 사이의 경로가 존재하고, 사이클이 존재하지 않는 경우만 고려한다.
- 정점과 정점 사이를 잇는 N-1개의 간선이 존재하며, 모든 정점은 연결되어 있다.
- 정점들이 모두 연결되어 있고, 사이클이 없는 그래프, 정점의 개수는 N이고 간선의 개수는 N-1개
아래의 특성 중 2개 이상 만족할 경우 트리
- 모두가 연결되어 있어서 어떤 두점을 골라도 간선을 타고 서로 이동 가능
- 사이클이 존재하지 않음
- 정점 개수 |V| = 간선 개수 |E|+1
트리와 루트 트리
- 트리에는 루트가 존재하는 경우와 루트가 존재하지 않는 경우가 존재
- 트리가 존재하는 경우, 트리의 깊이를 기준으로 루트로부터의 거리에 대한 조건을 참고해 문제를 푼다.
- 루트트리에는 조상, 자식, 형제, 말단 노드가 존재한다.
- 일반적인 알고리즘 문제에서는 루트 트리를 이용한다.
- |V|=|E|+1이므로, 인접행렬로 만든다면 |V|의 제곱으로 공간복잡도 낭비
백준
- 구현 (루트가 없는 트리에서 루트 만들기)
- 11725번. 트리의 부모 찾기
- 4803번. 트리
- DFS를 이용하는 동적계획법
- 1068번. 트리 (단말 노드의 개수(BFS/DFS)로도 가능)
- 15681번. 트리와 쿼리
- 14267번. 회사 문화1
- BFS
- 1991번. 트리 순회
- 5639번. 이진 검색 트리
- 9489번. 사촌
- 20364번. 부동산 다툼
- LCA (최소 공통 조상)
- 3584번. 가장 가까운 공통 조상
- 1240번. 노드 사이의 거리
- 최소신장트리 (크루스칼 알고리즘)
- 15900번. 나무 탈출 (BFS도 가능)
반응형
'Server Programming > BackEnd Project' 카테고리의 다른 글
[패스트캠퍼스 백엔드 개발자 부트캠프] 6. 미니 프로젝트 회고 (0) | 2023.05.30 |
---|---|
[패스트캠퍼스 백엔드 개발자 부트캠프] 5. 기자단 중간 회고 (1) | 2023.05.18 |
[패스트캠퍼스 백엔드 개발자 부트캠프] 4. 상품 주문 서비스 API 프로젝트 (0) | 2023.04.21 |
[패스트캠퍼스 백엔드 개발자 부트캠프] 3. 서버의 진화 과정과 보안 (0) | 2023.04.03 |
108일자 - TIL (0) | 2023.03.31 |