분류 전체보기 123

[Brute Force - 재귀] 두 동전

예제 입력 1 1 2 oo 예제 출력 1 1 예제 입력 2 6 2 .# .# .# o# o# ## 예제 출력 2 4 예제 입력 3 6 2 .. .. .. o# o# ## 예제 출력 3 3 예제 입력 4 5 3 ### .o. ### .o. ### 예제 출력 4 -1 예제 입력 5 5 3 ### .o. #.# .o. ### 예제 출력 5 3 - 재귀에서 return 값 반환하는거 연습해보기. #include #define MIN(a,b) ((a)= 0) && (r = 0) && (c < C); } }; int go(int cnt, Point coin1, Point coin2) { // 종료조건 // 1) cnt == 11 // 2) 두 동전 모두 떨어진 경우 // 3) 정답 찾은 경우 ..

[Brute Force - 재귀] 테트로미노

예제 입력 1 5 5 1 2 3 4 5 5 4 3 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1 예제 출력 1 19 예제 입력 2 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 예제 출력 2 20 예제 입력 3 4 10 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 예제 출력 3 7 - 회전/대칭이 가능하므로 아래 도형을 제외한 나머지는 임의의 1칸에서 시작해 3개의 칸을 연속해서 방문한 형태이다. - 아래 도형만 직접 처리하고, 나머지는 재귀로 처리할 수 있다. - Brute Force와 재귀함수의 차이점은 아래 처럼 방문후에 체크를 빼주어야 한다는 것이다. v..

[Brute Force - 재귀] 연산자 끼워넣기

예제 입력 1 2 5 6 0 0 1 0 예제 출력 1 30 30 예제 입력 2 3 3 4 5 1 0 1 0 예제 출력 2 35 17 예제 입력 3 6 1 2 3 4 5 6 2 1 1 1 예제 출력 3 54 -24 - 각 연산자의 개수를 int operators[4]로 선언하고 파라미터로 int* opreators를 넘겨주고 재귀로 짰더니 call by reference 때문에 결과 한번 나오면 모두 종료되어버림 -> 그냥 plus, minus, mutiply, divide 4개 변수를 각각 선언해버림 https://www.acmicpc.net/problem/14888 #include #define MAX_VALUE (2147483647) #define MIN_VALUE (-2147483648) #defi..

[Brute Force - 조합] 스타트와 링크

예제 입력 1 4 0 1 2 3 4 0 5 6 7 1 0 2 3 4 5 0 예제 출력 1 0 예제 입력 2 6 0 1 2 3 4 5 1 0 2 3 4 5 1 2 0 3 4 5 1 2 3 0 4 5 1 2 3 4 0 5 1 2 3 4 5 0 예제 출력 2 2 예제 입력 3 8 0 5 4 5 4 5 4 5 4 0 5 1 2 3 4 5 9 8 0 1 2 3 1 2 9 9 9 0 9 9 9 9 1 1 1 1 0 1 1 1 8 7 6 5 4 0 3 2 9 1 9 1 9 1 0 9 6 5 4 3 2 1 9 0 예제 출력 3 1 https://www.acmicpc.net/problem/14889 - 절반은 1번팀, 나머지 절반은 2번팀이므로 순열로 풀 수 있다. {1,1,1,1,..., 2,2,2,2,....} 그러..

[Brute Force - 순열] 연산자 끼워넣기

예제 입력 1 2 5 6 0 0 1 0 예제 출력 1 30 30 예제 입력 2 3 3 4 5 1 0 1 0 예제 출력 2 35 17 예제 입력 3 6 1 2 3 4 5 6 21 1 1 예제 출력 3 54 -24 https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. www.acmicpc.net - 최대/최소값을 구할 때, 음수가 등장할 경우 주의해야한다. 최대값을 0으로 설정하고 ..

[Brute Force - 순열] 단어 수학

예제 입력 1 2 AAA AAA 예제 출력 1 1998 예제 입력 2 2 GCF ACDEB 예제 출력 2 99437 예제 입력 3 10 A B C D E F G H I J 예제 출력 3 45 예제 입력 4 2 AB BA 예제 출력 4 187 https://www.acmicpc.net/problem/1339 - 이것 역시 최대값을 구하는 문제이기 때문에, 등장하는 알파벳 개수에 따라 9 ~ 0만 사용한다. 예를 들어, 등장하는 알파벳 개수가 4개라면, 숫자는 9,8,7,6 만 사용하면 된다. - 등장하는 최대 알파벳의 개수가 10이므로, 10!의 시간복잡도이므로, 배열의 인덱스를 순열로 돌려서 모든 경우에 대해 다 해볼 수 있다. #include #define MAX_WORD_SIZE (9) #define..

[Brute Force - 순열] 부등호

예제 입력 1 2 예제 출력 1 897 021 https://www.acmicpc.net/problem/2529 - 이 문제에서 k + 1 자리의 최대, 최소 정수를 출력해야하므로, 최소 정수의 경우는 0부터 k+1까지의 숫자만 사용하면 된다. 예를 들어, 0 1 과 4 7 은 같은 결과이기 때문에, 굳이 그 이상의 숫자를 활용할 필요가 없고 시간 복잡도도 줄일 수 있다. - 순서를 고려해야하므로, 순열을 사용하여 문제를 해결할 수 있다. STL을 사용하지 않는 경우, 배열의 인덱스만 순열으로 바꾸어 처리하고, 그 인덱스로 숫자를 만들어 문제를 해결했다. - STL없이 next_permuation을 직접 구현해 문제를 해결할 경우, 조합 문제에 대해서 사용하면 까다로운듯.....

[Brute Force - 재귀] 부분 수열의 합

예제 입력 1 5 0 -7 -3 -2 5 8 예제 출력 1 1 #include #define MAX_SIZE (21) int N, S; int num[MAX_SIZE]; int ans = 0; int go(int* num, int start, int N, int nowSum, int S) { // ★ 답을 찾았다고해서 반환해버리면 안된다. if (nowSum == S && start != 0) ans++; for (int i = start; i < N; i++) { go(num, i + 1, N, nowSum + num[i], S); } return ans; } int main(void) { scanf("%d %d", &N, &S); for (int i = 0; i < N; i++) scanf("%d",..

순열 활용하기

예제 입력 1 4 1 2 3 4 예제 출력 1 1 2 4 3 예제 입력 2 5 5 4 3 2 1 예제 출력 2 -1 https://www.acmicpc.net/problem/10972 10972번: 다음 순열 첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net #include #define MAX_SIZE (10001) int N; int arr[MAX_SIZE]; void swap(int* ar, int a, int b) { int temp = ar[a]; ar[a] = ar[b]; ar[b] = temp; } // 1. A[i-1] ..

Algorithm/Algorithm 2019.09.13