Git은 소스 코드나 프로젝트의 변화를 효과적으로 관리하고 추적하기 위한 분산 버전 관리 시스템(Distributed Version Control System) 중 하나입니다. 리누스 토르발스(Linus Torvalds)가 리눅스 커널 개발에 사용하려고 만들었으며, 현재는 다양한 소프트웨어 개발 프로젝트에서 광범위하게 활용되고 있습니다. Git은 각 개발자가 독립적인 저장소(repository)를 가지며, 중앙 서버와 연결되지 않아도 작업이 가능한 특징을 가지고 있습니다. 브랜치, 변경 이력 추적, 병합, 리베이스 등의 기능을 통해 협업과 유지 보수를 용이하게 하며, 원격 저장소와의 통합을 통해 효율적인 개발 환경을 제공합니다.
조합은 요소들을 특정한 순서없이 선택하여 그 부분 집합을 만드는 것을 의미합니다. 조합은 순서가 중요하지 않은 경우에 사용됩니다.
ex. A, B, C의 모든 조합은 AB, AC, BC
n개의 요소에서 r개를 선택하여 나열하는 경우의 수는 다음과 같이 표현됩니다.
$$ nCr = \frac{n!}{r!(n-r)!} $$
2. C++로 나타낸 조합
1) 재귀 함수 이용
#include <iostream>
#include <vector>
using namespace std;
void combination(int start, vector<int> v, int n, int k) {
if (v.size() == k) {
for (int i : v) {
cout << i << " ";
}
cout << endl;
return;
}
for (int i = start + 1; i < n; i++) {
v.push_back(i);
combination(i, v, n, k);
v.pop_back();
}
return;
}
int main() {
int n = 5; // 전체 요소의 개수
int k = 3; // 조합의 크기
vector<int> v;
combination(-1, v, n, k);
return 0;
}
n은 전체 요소의 개수이고, k는 조합의 크기입니다.
1. 만약 현재 선택된 요소들의 개수가 k와 동일하다면, 현재 조합을 출력하고 함수를 종료합니다.
2. 그렇지 않은 경우, start 다음 인덱스부터 끝까지의 요소를 하나씩 선택하여 v에 추가한 후, 재귀적으로 함수를 호출합니다.
3. 재귀 호출이 끝나면, 마지막에 선택한 요소를 v에서 제거하여 이전 상태로 돌아갑니다.
!! 여기서 나온 조합수들은 Index로 사용될 수 있습니다.
실행결과
2) for 다중루프 이용
#include <bits/stdc++.h>
using namespace std;
int n = 5;
int k = 3;
int main() {
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
for(int k = j + 1; k < n; k++){
cout << i << " " << j << " " << k << '\n';
}
}
}
return 0;
}
1. first와 last 사이의 범위에 있는 요소들의 순열을 다음 순서의 순열로 변경합니다.
2. 변경에 성공하면 true를 반환하고, 더 이상 다음 순열이 없으면 false를 반환합니다.
3. 변경된 순열은 first와 last 사이에 저장됩니다.
2. 사용 예시
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> example = {2, 1, 4};
sort(example.begin(), example.end());
do{
for (int i : example)
cout << i << " ";
cout << '\n';
} while (next_permutation(example.begin(), example.end()));
}
vector<int> example = {2, 1, 4};
-> 벡터를 선언합니다.
sort(example.begin(), example.end());
-> 벡터를 순서에 맞게 정렬합니다.
sort() std::sort 함수는 [first, last) 범위에 있는 요소들을 정렬합니다. ( 범위는 [first, last)로 지정되어 있으므로 last는 실제로 정렬에 포함되지 않습니다. )
for (int i : example)
-> 벡터 example에서 하나씩 꺼내어 루프를 돌려줍니다.
while (next_permutation(example.begin(), example.end()))
자료 구조(Data Structure)란 데이터를 조직화하고 저장하는 방법을 말합니다. 즉, 데이터를 효과적으로 관리하고 사용하기 위한 구조와 알고리즘이라고 할 수 있습니다.
자료 구조를 선택하는 기본적인 목표는 데이터에 대한 효율적인 연산을 가능하게 하면서, 메모리 공간을 효율적으로 사용하는 것입니다. 즉, 특정 연산(삽입, 삭제, 검색 등)을 효율적으로 수행하고, 데이터에 대한 특정한 패턴에 따라 구성된 메모리를 최적으로 활용할 수 있도록 설계됩니다.
자주 사용되는 자료 구조에는 배열, 리스트, 스택, 큐, 트리, 그래프, 해시 테이블 등이 있습니다. 각각의 자료 구조는 특정한 용도에 맞게 선택되며, 알고리즘을 효율적으로 구현하는 데 도움을 줍니다.