재귀(4)
-
[백준] 14501 | 퇴사 | C++
재귀와 동적계획법으로 풀 수 있다. 1. 재귀(브루트포스) 재귀함수의 변수로는 날짜(인덱스) - int L, 누적상담료 - int psum 으로 설정하였다. 현재 날짜를 L이라고 하자. 날짜 L에 상담을 할 것인지 하지 않을 것인지 선택을 해야 한다. 1. 날짜 L에 상담하기로 선택했다면, 다음에 선택할 수 있는 날짜는 언제인가? 바로 날짜 L+T[L]부터 상담이 가능할 수 있지 않은가? 그리고 여태껏 누적되어온 상담료 psum에 오늘 선택한 상담료 P[L]을 더한다. void f(int L, int psum) { ... f(L+T[L], psum+P[L]); } 다만 조건이 있다. 상담을 진행하는 도중에 휴가날을 맞이할 수는 없는 노릇이다. 그래서 상담할지 선택하기 전에, 다음 상담이 가능한 날짜(L+..
2022.07.21 -
[백준] 17478 | 재귀함수가 뭔가요? | C++
풀이의 핵심은 이렇다. 정답 소스코드 #include using namespace std; int n; void f(int L) { for(int i=0; i
2022.07.20 -
조합 (Combination)
- 조합 (Combination) - n개의 수를 중복을 허용하지 않고(start) r개를 순서 상관없이 나열할 수 있는 모든 경우의 수 (1 ≤ r ≤ n) 문제인식) 0부터 9(n)까지의 수가 있다. 이들을 이용하여 4(r)개의 수를 중복없이, 순서 상관없이 나열하고자 할 때 가능한 모든 경우를 각각 한 줄씩 출력하고자 한다면 어떻게 해야할까? int n=9, r=4; 해결과정) 1) 출력에 이용할 배열(a[4])을 준비한다. 2) 함수의 인수를 idx, start로 설정한다. idx는 a배열에 재귀진입하기위한 인덱스, start는 중복방지와 오름차순을 위한 시작점이다. 만약 1, 2, 3, 4의 네 수를 순열로 처리한다면... (이 경우, n=4, r=4, start=1인 셈) "1 2 3 4" "..
2022.04.20 -
순열 (Permutation) - 삽입방식 | (+중복순열, +함수사용)
- 순열 (Permutation) - n개의 수를 중복을 허용하지 않고(visited) r개를 나열할 수 있는 모든 경우의 수 (1 ≤ r ≤ n) 문제인식) 0부터 9(n)까지의 수가 있다. 이들을 이용하여 4(r)개의 수를 중복없이 나열하고자 할 때 가능한 모든 경우를 각각 한 줄씩 출력하고자 한다면 어떻게 해야할까? int n=9, r=4; 해결과정) 1) 출력에 이용할 배열(a[4]-주황)과 숫자의 중복방지를 위한 방문여부배열(visited[10]-파랑)을 준비한다. 2) 이 배열의 인덱스(idx)마다 0~9까지 삽입하는 반복문을 실행한다. idx는 재귀를 위한 인덱스. 3) 현재 인덱스(idx)에서 사용한 수(i)를 다음 인덱스(idx+1)에서 사용하지 않기 위해 방문처리(visited[i]=1..
2022.04.10