=> 1. 노드의 개수가 간선의 개수보다 하나가 더 많다. 2. 순환이 (X)
최소 신장 트리를 구하는 대표적인 알고리즘이 그리드 알고리즘이다.
이 알고리즘은 2가지로 다시 나누어서 이야기할 수 있다.
1. 프림 알고리즘, 2. 크루스칼 알고리즘
: 빠지없이 다 탐색하는거 깊이 너비를
어떤 가능성이 없는 곳을 알아보고 되돌아가는 것을 => 백트래킹이라고 한다. 가능성이 있는 곳을 탐색하는 알고리즘을 "백트래킹 알고리즘"
깊이 우선 탐색은 백트래킹을 활용한것이다.
[1,2,3,4] 중 2개의 숫자를 뽑앟서 합이 6을 초과하는 경우를 알아보자
단 뽑는 순서가 다르면 다른 경우의 수로 간주한다.
문제] 정수 N을 입력받아 1부터 N까지의 숫자 중에서 합이 10이 되는 조합을 리스트로 반환하는 학수 작성
조건] 백트래킹을 이용, 오름차순으로 정렬되어야 한다. (숫자 조합) .같은 숫자는 한번만 선택 가느아
N은 1이상 10이하인 정수
n=2일 경우 [] 빈 배열을 출력
class Solution {
private static ArrayList<ArrayListMInteger>> result;
private static int n;
private static void back(int sum, ArrayList<Integer> selectNum, int start){
if(sum == 10){
result.add(selectNum);
return;
}
for(int i= start; i <=n; i++){
if(sum +i <= 10){
ArrayList<Integer> list = new ArrayList<>(selectNum);
list.add(i);
back(sum + i, list, i+1);
}
}
}
private static ArrayList<ArrayList<Integer>> solution(int N){
result = new ArrayList<>();
n = N;
back(0, new ArrayList<>(), i);
return result;
}
https://school.programmers.co.kr/learn/courses/30/lessons/87946?language=java
class Solution {
public int answer; // 최대 던전 수
public boolean[] visited; // 방문 여부
//k 80
//dungeons [[80,20],[50,40],[30,10]]
public int solution(int k, int[][] dungeons) {
visited = new boolean[dungeons.length];
dfs(0, k, dungeons);
return answer;
}
public void dfs(int depth, int k, int[][] dungeons){
for(int i = 0; i < dungeons.length; i++){
if(!visited[i] && dungeons[i][0] <= k){
visited[i] = true;
dfs(depth+1, k-dungeons[i][1], dungeons);
visited[i] = false;
}
}
answer = Math.max(answer, depth);
}
}