사실 Create Repository 누르고 다음다음 누르면 생성이 되기때문에 따로 설명할것은 없지만, 각 옵션이 무엇을 의미하는지 정리하겠습니다.
1. Create Repository
우선 사진 1과 같이 Create New Repository를 클릭하면 Repository를 생성할 수 있습니다.
사진 1. Create Repository
2. Repository Type
Create New Repository를 클릭하면 나오는 사진 2와 같이 Repository Type 선택하기창이 나타납니다.
사진 2. Repository Type
FSFS (Fast Secure File System) : 표준 Subversion Repository로 기본적으로 사용하는 저장소 입니다.
VDFS (VisutalSVN Distributed File System) : 분산 파일 시스템과 유사한 형태를 지니며 특징은 다음과 같습니다. - Master / Slave 형태의 아키텍처로 구성 - Commit할 경우 Master Server로 적용된 후 Slave Server로 자동 복제 됨 - Slave Server로도 Commit 가능하며, 이 경우에 동이에 Master Server로도 자동 Commit 됨
▶ Distributed VDFS는 FSFS repository와 기능적으론 동일합니다. 그렇기 때문에 서버 구성을 어떻게 할 것인가에 따라 FSFS / VDFS를 선택하면 됩니다.
3. Repository Structure
Repository Type을 선택한 후에는 사진 3과 같이 Repository Structure를 선택해야 합니다.
사진 3. Repository Structure
이 두가지의 차이는 간단합니다. 하나의 Repository에 하나의 프로젝트를 관리하는가, 여러개의 프로젝트를 관리하는가에 따라 선택하면 됩니다.
Empty repository : Standard Project로, 한 개의 Repository에 여러 Project를 관리할 수 있는 구조로 Repository를 생성합니다.
Single-Project Repository : 한 개의 Repository에 하나의 Proeject를 관리할 수 있는 구조로 Repository를 생성합니다.
4. Repository Access Permissions
마지막 권한 설정입니다. 크게 설명할 것 없이, 작성되어 있는 그대로 원하는 것을 선택하여 생성하면 됩니다.
사진 4. Repository Access Permissions
Nobody has access : 아무나 접근 가능
All Subversion users have Read/Write access : SVN에 등록된 User들 접근 가능
Customize Permissions : 커스터마이징에 따라 접근 가능
5. Customize Permissions
Custom... 을 클릭하여 원하는 그룹 또는 계정마다 권한을 부여할 수 있는 옵션 입니다.
사진 5. Customize Permissions
여기까지 하면 SVN Repository가 생성 됩니다!
6. 생성 후 확인
생성이 완료되면 SVN Repository URL을 확인할 수 있습니다. SVN은 http,https,svn 프로토콜을 지원합니다.
사진 6. Repository URL 확인
이후 접근할 수 있는 계정을 사진 7과 같이 생성하면 해당 Repository로 접근 가능합니다.
tag 작성 : git tag -a {tag id} -m "{tag message}" tag 확인 : git tag tag push : git push {Remote Address} {tag id} commit log에서 tag 확인 : git log --decorate tag 삭제 : git tag -d {tag id} OR git tag --delete {tag id}
그래서 오늘은 속성 git tag 긋기!
tag를 긋는 이유는 아주아주 간단 합니다.
어느 버전인지를 알아보기 위함이죠
현재 어느 Commit까지 Release가 되었는지, 아니면 어느 시점부터 프로젝트가 다른 프로젝트와 Merge가 되었는지 등을 확인하기 위한 용도 입니다.
다음 아래 사진과 같은 commit log에 git tag를 작성하는 방법을 알아보겠습니다.
그림 1. git tag 긋기 01
1. tag 작성하기
위 사진에 화살표로 표기 된 commit에 새로운 Project의 시작점이라고 표기하기 위해서 "ERP_HR/Salary_Management_ver.1.0.1"를 그어보겠습니다
$git tag -a {tag id 입력} -m "{사용할 메세지 입력}" 예제 사용 명령어 : git tag -a ERP_HR/Salary_Management_ver.1.0.1 -m "ERP_HR/Salary_Management_ver.1.0.1"
그림 2. git tag 작성하기
2. tag 확인하기
이상이 없이 태그가 작성되면 작성되었는지 확인 합니다. 확인 명령어는 : git tag
그림 3. git tag 확인하기
3. 작성한 tag commit log에서 확인
이제 다시 commit log를 보면 아래 사진과 같이 tag가 표기 됩니다. 참고로 tag log까지 같이 보려면 $git log --decorate 이렇게 옵션을 줘야 표기 됩니다.
그림 4. commit log에서 작성한 tag 보기
4. tag push 하기
현재는 저의 작업 폴더에만 tag가 작성된것 이기 때문에, git tag를 작성해도 Remote로 Push 해주어야 합니다.
명령어는 일반 push와 동일합니다만, 작성한 tag만 push할 경우 $ git push {remote name} {tag id} 로 작성 합니다.
위 예제의 경우 $git push origin ERP_HR/Salary_Management_ver.1.0.1 라고 입력 하면 되겠져?
그림 5. tag push
이렇게 뜨면 완료!
tag의 장점은 checkout할 경우 tag id로도 가능하다는 것 입니다. 그래서 체크 포인트를 잘 작성하면 트러블 이슈 관리에 도움이 되겠죠!
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은붙어서입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
- 6줄 요약 - 크루스칼 알고리즘은 최소비용 신장트리를 만드는 알고리즘이다. 알고리즘은 다음과 같다.
1) 간선 가중치 중 가장 작은 값을 선택한다. 2) 간선을 연결하여 순환(Cycle)이 생기지 않는다면 연결 후 1)로 이동. 3) 연결 시 순환(Cycle)이 생기면 연결하지 않고 1)로 이동. (순환이 여부는 Union Find 알고리즘을 활용하여 알아냅니다!) 최소비용 신장트리의 간선의 수는 "노드의 수 - 1"
시작 합시다!
1. Kruskal 알고리즘이란?
Kruskal 알고리즘이란 모든 노드를 싸이클이 없도록 연결하는 트리를 만들기 위해 사용되는 알고리즘 입니다.
즉, 최소비용 신장트리를 찾는 알고리즘 이죠.
각 노드를 연결하는 간선에는 가중치가 있고, 해당 가중치 중 가장 적은 비용으로 모두 연결해야 할때 이 알고리즘을 사용합니다.
아래 예시를 보면서 이해를 해보져
그림 1. 크루스칼 알고리즘 예제
먼저 그림 1과 같이 5개의 노드가 있고, 연결 된 간선에는 가중치가 포함되어있을때,
크루스칼 알고리즘을 이용해서 가장 적은 비용으로 최소신장 트리를 만드는 방법을 알아보겠습니다.
크루스칼 알고리즘 적용 방식은 아래 3가지 입니다.
1) 간선 가중치 중 가장 작은 값을 선택한다. 2) 간선을 연결하여 순환(Cycle)이 생기지 않는다면 연결 후 1)로 이동. 3) 연결 시 순환(Cycle)이 생기면 연결하지 않고 1)로 이동. (순환이 여부는 Union Find 알고리즘을 활용하여 알아냅니다!)
간단하죠?
그림 1 예제를 통해 진행하겠습니다.
2. 예제를 통해 크루스칼 이론 학습하기
그림 1 그래프를 최소 비용으로 연결한다면 아래 그림 2와 같이 연결 될 것 입니다.
그림 2. 예상 결과 값
그럼 이렇게 연결이 되는지 확인해봅시다.
보기 편하도록 아래 그림 3과 같이 정리하고 시작할게요
그림 3. 최소비용 신장트리 만들기
최소비용 신장트리 만들기 시작!
2-1. 우선 첫번째로 가장 작은 가중치를 갖는 간선 '2<->5'를 선택 후 연결합니다.
그림 4. 최소비용 신장트리 만들기(1)
2-2. 이제 계속 반복 합니다. 다음 가장 작은 가중치 '4 <-> 5'를 선택하고 연결 합니다.
그림 5. 최소비용 신장트리 만들기(2)
2-3. 다음 작은 가중치 '1 <-> 3'을 선택하고 연결합니다.
그림 6. 최소비용 신장트리 만들기(3)
2-4 다음 작은 가중치 '2 <-> 4'를 선택합니다.
그런데! 2와 4를 연결하면 2 - 4 - 5 노드에 순환이 생기기 때문에 넘어가고 그 다음 작은 값 '1 <-> 2'를 선택 합니다.
그림 7. 최소비용 신장트리 만들기(4)
2-5 이제 어떤 간선을 선택해도 Cycle이 생성됩니다. 그렇기 때문에 최소비용 신장트리가 완성되었기에 종료!
그림 8. 최소비용 신장트리 만들기 (완성)
맨 처음 예상했던 결과값이랑 동일한 것을 확인할 수 있습니다.
그럼 바로 코드 구현으로 들어가 보져
3. 코드 구현하기
사실 크루스칼 알로리즘은
Union Find 알고리즘에 * 1. 간선의 최솟값을 찾기 => Arrays.sort (정렬 이용) * 2. 정렬된 배열 순서대로, 간선을 연결할 때 Cycle이 생기지 않으면 연결하도록 하기
를 추가하면 Kruskal 알고리즘이 됩니다. (아래 예제는 최소 비용 신장트리의 간선의 합을 구하는 코드 입니다.)
//부모 노드를 찾을 수 있는 함수
public int getParent(int parent[],int x) {
if(parent[x] == x) return x;
return parent[x] = getParent(parent,parent[x]);
}
//노드 연결해서 부모 값 작은걸로 변경하기
public int[] changeParent(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if(a<b) parent[b] = a;
else parent[a] = b;
return parent;
}
//부모 값이 동일한지 확인
public boolean findParent(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if (a==b) return true;
return false;
}
public int solution(int n, int[][] costs) {
int answer = 0;
int[] parent = new int[n]; //1,2,3,4,5,6
for(int i=0; i<n; i++) {parent[i] = i;}
//간선 정렬
Arrays.sort(costs, new Comparator<int[]>() {
@Override
public int compare(int[] arg0, int[] arg1) {
//오름차순 정렬
return arg0[2]-arg1[2];
}
});
//간선 오름차순으로 정렬되었기 때문에 Cycle이 아니라면 하나씩 더해주면 됨.
//0->1= 1 , 0->2 =2, 2->3 = 1 인경우 배열에 3의정보는 주지 않기때문에 costs.length 기준으로 하는것임
for(int i=0; i<costs.length; i++) {
//Cycle이 아닌경우 간선 가중치 더하기
if(!findParent(parent,costs[i][0],costs[i][1])) {
//연결하기
System.out.print(costs[i][2]+" ");
answer += costs[i][2];
changeParent(parent,costs[i][0],costs[i][1]);
}
}
System.out.println();
System.out.println(answer);
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
island_connection ic = new island_connection();
int n = 5;
int[][] costs = {{0,1,3},{0,2,4},{0,3,9},{1,3,3},{1,4,1},{2,3,5},{3,4,2}};
ic.solution(n, costs);
}