본문 바로가기

코딩 및 기타

(48)
동적 계획법 응용 : 정수 삼각형 ∙문제 해결 방법 - 정수 삼각형을 직각 삼각형 형태로 표현할 경우, 임의의 좌표 (x, y)에 이동하기 위해서는 (x - 1, y -1) 또는 (x, y - 1)좌표를 거쳐야한다. - 임의의 좌표 (x, y)에서의 삼각형 정수 값을 tri(x, y)라고 하고, 꼭대기 좌표에서 (x, y)까지 이동할 때의 정수 합의 최댓값을 dp(x, y)라고 할 경우 아래의 식이 성립된다. - 꼭대기 좌표부터 시작하여 왼쪽에서 오른쪽으로 위에서 아래 방향으로 dp(x, y) 값을 계산하고, 최종적으로 삼각형 바닥에서 dp(x, y)의 최댓값 구한다. ∙ 정수 삼각형 문제의 솔루션 함수의 예 int solution(vector triangle) { vector dp = triangle; int n = triangle.s..
동적 계획법 응용 : 최소 비용 경로 ∙ 최소 비용 경로 (minimum cost path) - 2차원 행렬의 각 셀에 정수 값 비용이 적혀 있을 때, 행렬의 좌상단에서 우하단까지 이동하기 위한 최소 비용을 계산하는 문제. 최소 경로 합 - 이동은 오른쪽 또는 아래쪽 방향으로만 가능 ∙ 문제 해결 방법 - 오른쪽 또는 아래쪽 방향으로만 이동할 수 있으므로, 임의이 좌표(x, y)에 도달하기 위해서는 (x-1,y) 또는 (x, y-1)좌표를 거쳐야 한다. - 임의의 좌표 (x, y)에서의 행렬 값(비용)을 m(x, y)라고 하고, 좌상단에서 (x, y)까지 이동하는 경로의 최소 비용을 C(x, y)라고 할 경우 아래의 식이 성립된다. C(x, y) =. min(C(x - 1, y), C(x, y - 1)) + m(x, y) - 좌상단 좌표부터..
동적 계획법 ∙ 동적 계획법 (dynamic programming) - 복잡한 문제를 간단한 여러 개의 부분 문제로 나누고, 부분 문제에 대한 해답을 활용하여 전체 문제를 해결하는 문제 해결 방식 - 분할 정복법에서는 분할된 부분 문제들이 서로 겹치지 않지만, 동적 계획법에서는 중복되는 부분 문제가 발생한다는 점이 다름 - 보통 최적화 문제 또는 카운팅 문제에 적용 - 유명한 동적 계획법 문제 > 0-1 배낭 문제 > 부분집합의 합 문제 > 최장 공통부분 시퀀스 > 연쇄 행렬 곱셉 > 최소 비용 경로 ∙ 동적 계획법 필요 조건 - 중복되는 부분 문제 (overlapping subproblems) > 주어진 문제를 여러 개의 부분 문제로 분할할 경우, 몇몇 부분 문제가 반복되어 나타나는 현상 > 부분 문제의 솔루션을 ..
그래프 순회 응용 (네트워크) 문제 설명 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다. 컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오. ∙문제 해결 방법 - 그래프 순회(DFS, BFS)를 이용하여 해결 가능 - 그래프의 정점을 모두 방문하기 위해 필요한 (최소) 그래프 순회 횟수를 카운트 - 즉, 0부터 n -..
DFS 와 BFS 그래프 순회 (graph traversal) - 하나의 정점에서 시작하여 모든 정점들을 한번씩 방문하는 작업 - 많은 문제들이 그래프 순회를 이용하여 해결될 수 있음 > ex) 두 정점 사이의 연결 경로가 있는지 검사, 최단 거리 검사 등 - 대표적인 그래프 순회 방법 > 깊이 우선 탐색 (DFS : Depth First Search) > 너비 우선 탐색 (BFS : Breadth First Search) ∙ 깊이 우선 탐색 (DFS : depth first serach) - 현재 정점과 인접한 정점 중 하나를 선택하여 이동하는 과정을 반복하고, 더 이상 이동할 정점이 없을 경우 뒤쪽으로 백트래킹하여 다시 이동할 경로를 탐색 - 시작 정점으로부터 거리가 멀어지는 방식으로 정점을 탐색 - 보통 재귀 또는 ..
그래프 ∙ 그래프 - 객체 간의 연결 관계를 표현할 수 있는 비선형 자료 구조 - 쾨니히스베르크의 다리 문제(한붓그리기)'가 그래프 이론의 시초로 알려져 있음 - 그래프의 예 : 지도에서 도시들의 연결, 지하철 노선도, SNS 친구 관계도 등 ∙ 그래프의 구성 요소 - 그래프 G = (V, E) - 정점 (vertex, node) : V > 그래프를 구성하는 기본 단위. 노드 > 자료를 저장하거나 상태를 표현 - 에지 (edge, link) : E > 정점과 정점을 잇는 선, 간선 > 방향을 가질 수 있음 > 가중치를 가질 수 있음 ∙ 인접 행렬(adjacency matrix) - 정점 개수가 N인 경우, N X N 크기의 2차원 행렬로 정점의 인접 관계를 표현하는 방법 - adj [u][v] : 노드 u에서 ..
순서없는 연관 컨테이너 std::unordered_set 컨테이너 - key 타입의 키 값을 저장하는 순서없는 연관 컨테이너 - 데이터 삽입, 삭제, 탐색은 O(1) 시간 복잡도로 동작 - 만약 중복되는 데이터를 unordered_set 구조로 저장하려면 std::unordered_multiset 사용 - 사용자 정의 타입을 저장할 경우, 해시 함수 Hash와 비교를 위한 KeyEqual을 지정해야 함 - 에 정의되어 있음 - 주요 함수 사용법은 std::set과 거의 유사함 #include #include #include #include using namespace std; // car -> radio -> orange -> ear -> radio // 끝말잇기 게임에서 중복된 단어를 말했는지 체크하는 코드 int main(..
해싱과 해시 함수 ∙ 해싱 (hashing) - hash 잘게 썰은 것, 긁어모은 것, 아무렇게나 뒤섞다. - 각각의 데이터를 (가급적) 고유한 숫자 값으로 표현하고, 이를 이용하여 특정 데이터의 존재 여부를 확인하거나 또는 원본 데이터를 추출하는 작업 - 응용 분야 : 빠른 자료 탐색(O(1), 변조 탐지 및 에러 검출 (MD5, SHA) ∙ 해싱이 필요한 경우 - 요구사항 : 정수를 저장하고 있는 컨테이너가 있고, 이 컨테이너에 특정 정수가 들어 있는지를 빠르게 판단하고 싶음 - 해결 방법 : 적절한 크기의 bool 타입 배열을 하나 만들고, 이 배열에서 입력 정수에 해당하는 인덱스의 원소 값을 true로 설정 - 문제점 : 정수 범위가 너무 크다면? 데이터가 실수라면? 데이터가 숫자가 아니라면? -> 어떠한 데이터 ..