본문 바로가기

재귀, 백트래킹 (Recursion, Backtracking)

(17)
백준 14501 퇴사 문제 링크: https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net solve(int day, int sum) 함수는 day일에 있는 상담을 할지 말지 결정하고, sum은 day일까지 얻은 수익을 구하는 함수이다. day일에 있는 상담을 할 경우 앞으로 t일만큼은 일을 할수가 없으므로 solve(day + t[day], sum + p[day])를 호출하면 되고, day일에 있는 상담을 하지 않을 경우 수익이 바뀌지 않은채로 다음날로 넘어가면 되므로(day일의 상담을 하지 않고, 그 다음날의 상담을 하는게 이득일수도 있으니까) solve(day + 1, sum)을 호출하면 된다. 1 2 3..
백준 1759 암호 만들기 문제 링크: https://www.acmicpc.net/problem/1759 1759번: 암호 만들기 첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다. www.acmicpc.net 주어진 알파벳으로 가능한 조합들을 다 만들어보고, 각 조합마다 자음과 모음갯수를 세서 조건에 맞으면 출력하면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include using namespace std; int l, c; cha..
백준 9095 1, 2, 3 더하기 문제 링크: https://www.acmicpc.net/problem/9095 9095번: 1, 2, 3 더하기 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각 www.acmicpc.net 주어진 숫자 n을 1, 2, 3의 합으로 표현할수 있는 방법의 수를 구하는 문제이다. int 값을 리턴하는 재귀함..
백준 6603 로또 문제 링크: https://www.acmicpc.net/problem/6603 6603번: 로또 문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2 www.acmicpc.net 주어진 숫자들을 이용하여 6개짜리 조합을 출력하는 문제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1..
백준 10971 외판원 순회 2 문제 링크: https://www.acmicpc.net/problem/10971 10971번: 외판원 순회 2 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j로 가기 위한 비용을 나타낸다. 항상 순회할 수 있는 경우만 입력으로 주어진다. www.acmicpc.net N의 제한이 작기 때문에, next_permutation을 이용하여 모든 가능한 경로에서의 비용을 구하고, 그 비용들의 최소값을 구하면 된다. 한 도시에서 다른 도시로 못가는 경우도 있기때문에 예외처리를 잘 해줘야한다. 1 2 3 4 5 6 7 8 9 10 11 ..
백준 10819 차이를 최대로 문제 링크: https://www.acmicpc.net/problem/10819 10819번: 차이를 최대로 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다. www.acmicpc.net 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include using namespace std; int n, a[10]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i > a[i]; sort(a, a + n); int a..
백준 10974 모든 순열 문제 링크: https://www.acmicpc.net/problem/10974 10974번: 모든 순열 N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오. www.acmicpc.net 말그대로 모든 순열을 순서대로 출력하는 문제이다. 두가지 방법으로 풀었는데, 하나는 재귀함수를 사용하였고 다른하나는 next_permutation 함수를 사용하였다. 아래코드는 재귀함수를 사용한 코드이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include using namespace std; int n, a[10]; bool used[10]; voi..
백준 10973 이전 순열 문제 링크: https://www.acmicpc.net/problem/10973 10973번: 이전 순열 첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net 주어진 순열의 이전 순열을 구하는 문제이다. prev_permutation이라는 함수를 이용하였고, 그 이용방법은 next_permutation과 동일하다. 예를 들어, 1 2 4 3 네개의 숫자가 배열 혹은 벡터에 들어있다고 하자. prev_permutation(a, a + n) 혹은 prev_permutation(v.begin(), v.end())를 실행하면 네개의 숫자가 1 2 3 4 이전 순열로 바뀌게 되고 함수는 true를 리턴한다..