본문 바로가기

코딩 및 기타/어서와! 자료구조와 알고리즘

(34)
투포인터, 슬라이딩 윈도우 알고리즘 ∙ 투포인터 알고르짐 문제의 유형 1. 포인터 2개가 같은 방향으로 진행하는것 /* N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을작성하시오. */ #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N, M; cin >> N >> M; vector numbers (N,0); for (int i = 0; i > numbers[i]; } int start = ..
C++ 문법 뽀개기 ∙ C언어와 C++ 그리고 C#이 무엇인가? - C언어 : 아주 먼 옛날 벨 연구소에서 Unix라는 운영체제(OS)를 개발 목적으로 탄생한 언어이다. - C++ : 조금 먼 옛날 C언어에서 한단계 진화한 언어로 객체와 클래스라는 개념이 처음 도입이 되었다. 이후 템플릿이라는 기능이 추가되어 더욱더 강력해졌고 지금도 계속 꾸준히 발전중이다. - C# : 마이크로소프트사에서 2000년대 개발한 언어인데, 사실 Java를 대항하기 위해 탄생한 언어이다 보니 C와 C++만큼 관련은 없다. ∙ C++ 의 장점 1. 속도가 빠르다. (python 보다 수십배에서 수백배정도!) 2. 사용자가 직접! 메모리를 관리할 수 있다. 3. cross-platform : 하나의 코드를 여기저기서 사용 -> C++으로 하나를 만..
동적 계획법 응용 : 정수 삼각형 ∙문제 해결 방법 - 정수 삼각형을 직각 삼각형 형태로 표현할 경우, 임의의 좌표 (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에서 ..