728x90
📍 섹션8. DFS, BFS 활용
DFS, BFS 활용 섹션 - (1)
8-1. 합이 같은 부분집합 | DFS
import java.util.Scanner;
/* 8-1. 합이 같은 부분집합 (DFS)
[입력]
첫 번째 줄에 자연수 N(1<=N<=10)이 주어집니다.
두 번째 줄에 집합의 원소 N개가 주어진다. 각 원소는 중복되지 않는다.
[출력]
첫 번째 줄에 “YES" 또는 ”NO"를 출력한다.*/
public class Main1 {
static String answer = "NO";
static int n, total=0;
boolean flag = false;
//DFS
public void DFS(int L, int sum, int[]arr) {
if(flag == true) return;
if(L == n) { //레벨이 n렙벨 되면 하나의 부분집합 깊이 탐색 완료된 시점임
if(total - sum == sum) {
answer = "YES";
flag = true;
}
}else {
//왼쪽 사용 O
DFS(L+1, arr[L]+sum, arr);
//오른쪽 사용 X
DFS(L+1, sum, arr);
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main1 T = new Main1();
Scanner kb =new Scanner(System.in);
n= kb.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = kb.nextInt();
total += arr[i];
}
T.DFS(0, 0, arr);
System.out.println(answer);
}
}
8-2. 바둑이 승차 | DFS
import java.util.Scanner;
/* 8-2. 바둑이 승차(DFS)
[입력]
첫 번째 줄에 자연수 C(1<=C<=100,000,000)와 N(1<=N<=30)이 주어집니다.
둘째 줄부터 N마리 바둑이의 무게가 주어진다.
[출력]
*/
public class Main2 {
static int c, n, answer=Integer.MIN_VALUE;
boolean flag = false;
//DFS
public void DFS(int L, int sum, int[]arr ) {
//트럭 용량 C 넘어가면 그냥 리턴
if(sum > c) return;
if(L == n) {
//마지막 레벨딴 까지 오면 기존 answer와 들어온 sum 중에 더 큰 값으로 answer 세팅
answer = Math.max(answer, sum);
}else {
//사용O
DFS(L+1, sum+arr[L], arr);
//사용X
DFS(L+1, sum, arr);
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main2 T = new Main2();
Scanner kb = new Scanner(System.in);
c = kb.nextInt();
n = kb.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) arr[i] = kb.nextInt();
T.DFS(0, 0, arr);
System.out.println(answer);
}
}
8-3. 최대 점수 구하기 | DFS
import java.util.Scanner;
/* 8-3. 최대 점수 구하기 DFS
* */
public class Main3 {
static int answer = Integer.MIN_VALUE;
static int n, m;
boolean flag = false;
//DFS
public void DFS(int L, int sum, int time, int[]ps, int[]pt) {
//제한 시간 넘어갈 경우 return;
if(time > m) return;
if(L == n) {
answer = Math.max(answer, sum);
}else {
//문제 푼다
DFS(L+1, sum+ps[L], time+pt[L], ps, pt);
//문제 안푼다.
DFS(L+1, sum, time, ps, pt);
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main3 T = new Main3();
Scanner kb = new Scanner(System.in);
n = kb.nextInt(); //문제수
m = kb.nextInt(); //제한 시간
int[] ps = new int[n];
int[] pt = new int[n];
//입력받기
for(int i=0; i<n; i++) {
ps[i] = kb.nextInt();
pt[i] = kb.nextInt();
}
T.DFS(0, 0, 0, ps, pt);
//출력
System.out.println(answer);
}
}
8-4. 중복 순열 구하기 | DFS
- 이 문제는 1~N까지 중복 허용하여 M번 뽑아 일렬로 나열하라고 한다.
- 레벨 L은 M번까지 깊이 들어갈 수 있고, M번을 다 뽑았으면 스택 back 하면 됨
- 각 레벨 L에서는 for(int I~N)까지 돌면서
**각 L번쨰 뽑았을 때 pm[L] = I 담고, DFS(L+1) 로 뻗어나간다.**
import java.util.Scanner;
/* 8-4. 중복순열 구하기*/
public class Main4 {
static int[] pm;
static int n, m;
//DFS n개씩 뻗어나가면서 m번 뽑아나감
public void DFS(int L) {
if(L == m) { //정해진만큼 뽑았으면 깊이 O
for(int x : pm) System.out.print(x+ " ");
System.out.println();
}else {
//각 단계에서 1~n가닥씩 뻗어나감
for(int i=1; i<=n; i++) {
pm[L] = i;//중복순열 담고
DFS(L+1);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main4 T = new Main4();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
pm = new int[m]; //m번 뽑으니까
T.DFS(0);
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 1' 카테고리의 다른 글
DFS, BFS 활용 섹션 - (3) (0) | 2023.03.27 |
---|---|
DFS, BFS 활용 섹션 - (2) (0) | 2023.03.24 |
그래프 관련 정리 -(1) (0) | 2023.03.22 |
DFS, BFS 개념 -(2) (0) | 2023.03.21 |
섹션 7. DFS, BFS 기초 섹션 - (2) DFS와 BFS (0) | 2023.03.20 |