1. 순열 1. swap을 이용한 재귀함수 구현 => 사전순 출력x #include #include #include using namespace std; int n; vector v(10); void permutation(int s, int e) { if (s == e) { for (int i = 0; i < n; i++) { cout
Algorithm
1. 유니온 파인드 1) 의미 - 그래프 알고리즘으로 Union(합집합) + Find(찾다)로 '합집합 찾기' 라는 의미를 가지고 있다. - 서로소 집합(Disjoint Set) 이라고 불리기도 한다. - 여러 노드 중 두 노드를 선택하여 같은 그래프에 속해 있는 지 확인하는 알고리즘이다. 2) 연산 - 2가지 연산이 존재한다. ① Find(x) : 원소 𝑥가 속한 부분집합을 찾는다. 보통 𝑥가 속한 부분집합의 대표 원소를 되돌려준다 ② Union(x, y) : 원소 𝑥가 속한 부분집합과 원소 𝑦가 속한 부 분집합의 합집합을 구한다. * 각 부분집합은 트리로 나타낸다. 3) 구현(배열 이용) - 미리 해야할 과정 노드의 개수 만큼 배열을 선언한다. 각 노드의 루트노드를 가르키는 배열을 선언하고, 초기화 ..
2644번: 촌수계산 (acmicpc.net) 2644번: 촌수계산 사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진 www.acmicpc.net 난이도 : 실버 2 문제 설명 : 촌수를 구하는 문제였습니다. DFS와 BFS를 이용하여 구할 수있습니다. 코드 설명: DFS함수의 인자로 now, end, num을 받습니다. now와 end는 구하려는 가족의 넘버이며, num은 촌수계산을 위한 변수입니다. dfs를 돌면서, 방문하지 않은 노드면 num에 +1을 해주고 둘이 가족(연결되어있으면)이면 num을 출력합니다. 둘이 다른 가족이면 ans은 0..
11724번: 연결 요소의 개수 (acmicpc.net) 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 난이도 : 실버2 문제 설명 : 연결 요소란, 무방향 그래프에서 적어도 한 개 이상의 경로로 연결된 정점들로 구성된 종속 그래프를 이야기합니다. 예를 들어, 아래와 같은 그림이 있을 때, 연결 요소의 개수는 2개입니다. (각각의 떨어져 있는 그래프가 2개!) 풀이 과정 : DFS나 BFS로 풀 수있는 문제입니다. 이 문제를 풀기 전에 dfs와 b..
8958번: OX퀴즈 (acmicpc.net) 8958번: OX퀴즈 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수 www.acmicpc.net 난이도 : 브론즈2 과정 : 연속된 O의 개수들을 더하는 문제였습니다. 연속된 O의 개수를 담는 변수 CNT와, CNT를 더하는 ANS 변수를 선언하여 반복문을 이용해 답을 구하였습니다. #include #include using namespace std; int n; int main() { cin >> n; string arr; for (int i = 0; i > ..
1. 퀵 정렬(분할정복법) 1) 과정 - 리스트에 원소 하나를 고른다(피벗) - 피벗과 다른 n-1개 원소 각각을 비교하여, 피벗보다 작은 것과 큰 것으로 분할한다. - 분할된 두 개의 작은 리스트를 재귀적으로 정렬한다. 2) 피벗 선택방법 - 중앙값(최선 피벗) - 랜덤선택 - 리스트 맨앞, 중간, 맨뒤에 있는 세 원소의 중앙값을 선택 3) 코드 void Quick_sort(int arr[],int i, int j) { int n, cnt = 0; if (i >= j) return; int pivot = arr[(i + j) / 2]; int left = i; int right = j; while (left pivot) right--; if (left
1. 정렬 알고리즘 - 정렬알고리즘은 알고리즘 중에 가장 기본적인 알고리즘 이다. - 이 글에서 살펴볼 알고리즘은 삽입, 선택, 거품(버블), 퀵, 합병(merge), 힙, 이진탐색 트리를 이용한 정렬이다. 1) 삽입정렬 - O(n^2) - 배열의 모든 원소를 앞에서부터 차례대로 배열 부분과 비교하여, 삽입함으로써 정렬하는 알고리즘 - 처음 key 값(처음으로 뽑아 비교할 원소)은 두번째 원소이다 > 과정 두번째 원소 10을 뽑아 첫번째 원소와 비교하여 29보다 작으므로 29왼쪽으로 삽입된다. 세번째 원소 14를 뽑아 두번째 원소와 비교하여 29보다 작으므로 29왼쪽으로 삽입된다. 14는 10보다 크므로 바뀌지 않는다. 네번째 원소 37를 뽑아 세번째 원소인 29와 비교한다. 37이 29보다 크므로 바뀌..
1. 문제 * 길이가 n인 배열 A[0], A[1], ..., A[n-1] 이 입력으로 주어 질때, i번째부터 j번째까지 원소드로 이루어진 배열 A[i], ..., A[j] 를 부분배열이라고 하고, A[i, j] 로 나타낸다. - 부분 배열의 속한 원소들의 합이 최대가 되는 부분 배열을 구하는 것이 이 문제의 목적이다. 이 때 길이가 0인 부분배열도 허용하며, 이 부분배열의 원소들의 합은 0이라고 정의한다. 예를 들어, 아래와 같은 배열이 있다면, -2 -1 3 5 2 -5 0 2 이 배열의 최대부분배열의 합은 몇일까? 3+5+2 = 10 이다. 2. 해결방법 - 최대부분배열의 원소합을 구하는 알고리즘에는 크게 4개가 있다. - 완전탐색, 중복제거한 탐색, 분할정복법, 동적계획법 1) 완전탐색(브루트포스..
1. BFS란? - BFS 는 너비우선탐색을 말합니다. - 루트 노드에서 시작하여 인접한 노드를 탐색하는 방법입니다. Q. 너비우선 탐색을 하면 순서가 어떻게 될까요? A. 0 - 1 - 2 - 3 - 4 - 5 -6 1) 특징 - 두 노드사이의 최단 경로를 찾을 때, 임의의 경로를 찾을 때 사용 - 코드가 DFS보단 복잡하지만 속도는 더 빠르다 2) 알고리즘 구현 방법 BFS의 결과 : 1 - 2 - 6 - 3 - 4 -5 - 큐를 이용하여 구현함 void bfs(int st) { q.push(st); visited1[st] = 1; while (!q.empty()) { int now = q.front(); q.pop(); printf("%d ", now); for (int i = 0; i < adj[..