Algorithm 306

조합수(메모이제이션)

n개 중에 c개를 뽑는 가짓 수를 의미한다. import java.util.*; public class Main { //메모이제이션 사용해야 재귀가 많이 안 뻗음!!! //구한 값을 다시 안구한다! int[][] dy = new int[35][35]; public int DFS(int n, int r){ //메모이제이션!!! if(dy[n][r] > 0) return dy[n][r]; //1을 리턴하는 경우 if(n == r || r == 0) return 1; else return dy[n][r]=DFS(n-1, r-1) + DFS(n-1, r); } public static void main(String[] args) { Main T = new Main(); Scanner kb = new Scanne..

Algorithm/inflearn 2021.10.04

순열 구하기(DFS)

중복순열문제와는 다르게 사용 여부를 체크하는 배열이 필요하다. 그리고 1부터 N까지의 순열이 아니고 입력값 배열로 주어진다. 크게 보자면 중복순열을 방지하기위해 사용 여부 체크하는 배열만 달라졌다! 사용 여부를 체크하는 배열 - ch 출력할 숫자를 넣어놓을 배열 - pm 순열로 사용할 숫자들이 들어있는 배열 - arr import java.util.*; public class Main { static int[] pm, ch, arr; static int n, m; public void DFS(int L){ //순열의 완성 if(L == m) { for(int x : pm) System.out.print(x + " "); System.out.println(); } else { //n가닥으로 뻗어나가야 한다..

Algorithm/inflearn 2021.10.04

동전교환(DFS, BFS)

부분집합 문제와는 다르게 동전을 여러개 쓸 수 있다. 여기선 해당 인덱스의 동전을 사용한다. 라고 재귀호출 L == n 이 되면 모두 1원으로 바꾸어주는 것 ~ 5원으로 바꾸어주는 것에 대한 조합(?)들이 만들어진다. ★구해둔 동전의 갯수가 있을 때 그 갯수보다 많이 거슬러주는 부분을 찾아볼 필요가 없다. BFS가 좀 더 맞는답. 1.DFS import java.util.*; public class Main { static int n, m, answer = Integer.MAX_VALUE; //L을 동전의 갯수,sum을 L개의 동전의 총합이라 생각 public void DFS(int L, int sum, Integer[] arr) { //동전의 총합이 m보다 크면 만들 수 없음 if(sum > m) re..

Algorithm/inflearn 2021.10.03

중복순열 구하기(DFS)

이전 문제랑은 다르게 이 문제부터는 가지가 2 가닥이 아닌 여러 가닥으로(N번) 뻗는다. 출력할 숫자를 넣어놓을 배열이 필요하다. L은 숫자를 뽑는 갯수로 설정한다. import java.util.*; public class Main { static int[] pm; static int n, m; public void DFS(int L) { if(L==m) { for(int x : pm) System.out.print(x + " "); System.out.println(); } else { //2가닥이 아닌 N가닥씩 뻗어나가야함. for(int i = 1; i

Algorithm/inflearn 2021.10.03