동적 계획 알고리즘(DP/Dynamic Programming)
·
💻 알고리즘/이론
동적 계획 알고리즘(DP) 주어진 문제를 부분 문제로 나누어서 푼 다음, 그 결과로 주어진 문제를 푸는 방법 부분 문제의 정보를 저장->시공간적 효율 증가 memoization 활용 최적 부분 구조(기본 문제의 최적해가 부분 문제의 최적해를 포함) DP 적용 여부 판단 방법 1.문제를 같은 형태의 하위 구조로 나눌 수 있는가 2.하위 문제의 계산이 반복되는가 (최적화, 최대화, 최소화, 어떡 작업의 경우의 수를 구하는 문제인가 *애매한 경우에 참고할 수 있는 대표적인 DP 문제 유형) DP 적용 과정 1. 점화식 / 재귀 과정 정의 - 문제를 Top-Down(하향식/재귀) 으로 정의한다 - 문제 풀이에 필요한 기본적인 문제의 하위 부분 값을 초기화 - 종료 조건 추가 2. memoization 적용 3...
그리디(Greedy)/탐욕 기법
·
💻 알고리즘/이론
그리디 알고리즘 가장 직관적인 알고리즘 설계 패러다임으로 최적화 문제(가능한 해들 중 가장 좋은(최대/최소) 해를 찾는 문제)를 해결한다. 모든 선택지를 고려하지 않고, 각 단계마다 가장 좋은 방법만을 선택 (근시안적 태도) -> 근시안적인 선택으로 부분 문제의 최적해를 찾고, 이들을 모아서(축적하여) 문제의 최적해를 얻는다. 근시안적이기 때문에 많은 경우 최적의 정답을 찾아주지 못한다. 그렇기에 정당성 증명이 필수적!(해결 가능한 문제가 제한적) -탐욕적 선택 속성 : 탐욕적으로 선택하더라도 문제의 최적해를 구할 수 있다 -최적 부분 구조 : 부분 문제의 최적해에서 전체 문제의 최적해를 만들 수 있다. 그리디의 사용 1. 동전 거스름돈 문제 거스름돈 액수에 대한 최소 동전 수를 출력하는 문제 -거스름돈..
분할정복(Divide and Conquer) - 최근접 점의 쌍 찾기
·
💻 알고리즘/이론
최근접 점의 쌍(closest pair) 문제는 2차원 평면상의 n개의 점이 입력으로 주어질 때 거리가 가장 가까운 한 쌍의 점(거리)을 찾는 문제이다. 최근접 점의 쌍을 찾는 방법으로는 모든 점에 대하여 각각의 두 점 사이의 거리를 계산하여 가장 가까운 점의 쌍을 찾는 방법 (BruteForce) - O(n^2) n개의 점을 1/2로 분할하여 각각의 부분 문제에서 최근접 점의 쌍을 찾고 부분해 중 짧은 쌍을 찾는 방법 (분할정복) 이 있다. 부분해를 취합(정복)하는 과정에서 중간 영역 사이의 점에서 더 근접한 점의 쌍이 존재할 수 있다. 중간 영역의 점들은 [왼쪽 그룹의 가장 오른쪽 점의 x 좌표에서 부분해를 뺀 값과 오른쪽 그룹의 가장 왼쪽 점의 x좌표에서 부분해를 더한 값 사이의 x 좌표 값을 가진..
분할정복(Divide and Conquer)
·
💻 알고리즘/이론
분할정복 -주어진 문제를 둘 이상의 부분 문제로 나누어서 푸는 방법 -비슷한 크기로 문제를 나눔 -재귀호출 사용 분할정복 과정 Divide :부분 문제로 나눌 수 있는 경우 2개 이상의 문제로 나눈다. Conquer : 더 이상 나눌 수 없는 경우 현재 문제를 정복한다. Combine : 해결된 문제들을 병합하여 기존 문제를 해결한다. 분할 횟수 입력의 크기가 n이고 총 분할한 횟수가 k라면. -1번 분할 후 입력 크기 : n/2 -2번 분할 후 입력 크기 : n/2^2 ... -k번 분할 후 입력 크기 : n/2^k --> n/2^k 가 1 이라면 더 이상 분할 불가 분할 횟수 분할정복의 사용 1. 합병정렬(Merge Sort) 입력이 2개의 부분문제로 크기가 반씩 줄어드는 분할 정복 알고리즘 -n개의..
[2017 카카오코드 예선] 컬러링북 - 파이썬
·
💻 알고리즘/PS
문제 https://programmers.co.kr/learn/courses/30/lessons/1829 코딩테스트 연습 - 카카오프렌즈 컬러링북 6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5] programmers.co.kr 영역의 수와 가장 큰 영역의 넓이를 구하는 문제이다. 문제풀이 흔히 볼 수 있는 bfs 문제와 유사하다. que에 좌표를 넣고 que가 빌 때까지 move를 이용해 주위 좌표(상,하,좌,우)를 탐색하고, 동일한 값을 지닌 좌표는 que에 추가해주는 방식으로 탐색을 진행한다. 해당 좌표를 방문했다면 check 값을 바꿔주어 방문 체크를 해준다. bfs를 새로 실..