실버 120

[백준 15624] 피보나치 수 7 [C]

풀이 "백준 2747, 피보나치 수"를 풀었던 방법으로 해결할 수 있다. 소스코드 #include const int MOD = 1e9 + 7; long long fibo(int n){ long long fiboNum[2] = {0, 1}; for (int i = 1 ; i < n; i++) fiboNum[(i+1)%2] = (fiboNum[i%2] + fiboNum[(i-1)%2]) %MOD; return fiboNum[n%2]; } int main(){ int n; scanf("%d", &n); printf("%lld", fibo(n)); } 출처 및 참고자료 15624번: 피보나치 수 7 첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다. www.acmicpc.net..

[백준 5639] 이진 검색 트리 [C]

풀이 조건에 맞게 값을 넣어줄 수 있는 Binary Search Tree를 구현하는 문제이다. 소스코드 #include #include typedef struct node{ int data; struct node *left, *right; }*pNode; void postorder(pNode root){ if (root == NULL) return; postorder(root->left); postorder(root->right); printf("%d\n", root->data); } pNode make_tree(pNode root, int data){ if (root == NULL){ root = (pNode)malloc(sizeof(pNode)); root->data = data; root->left..

[백준 15666] N과 M (12) [C]

풀이 "백준 15664, N과 M (10)"에서 기존에 i번째 요소를 사용했는지를 확인하기 위해 사용한 check를 빼면 해결할 수 있다. 소스코드 #include #include int N, M, arr[8], visited[8]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth, int start){ for (int i = start, temp = 0; i < N; i++) if (temp != arr[i]){ temp = visited[depth] = arr[i]; if (depth + 1 == M){ for (int idx = 0; idx < M; idx++) printf("%d ",..

[백준 15665] N과 M (11) [C]

풀이 "백준 15663, N과 M (9)"에서 기존에 i번째 요소를 사용했는지를 확인하기 위해 사용한 check를 빼면 해결할 수 있다. 소스코드 #include #include int N, M, arr[7], visited[7]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth){ for (int i = 0, temp = 0; i < N; i++) if (temp != arr[i]){ temp = visited[depth] = arr[i]; if (depth + 1 == M){ for (int idx = 0; idx < M; idx++) printf("%d ", visited[idx]); ..

[백준 15656] N과 M (7) [C]

풀이 "백준 15651, N과 M (3)"와 비슷하다. 1부터 N까지가 아닌 입력받은 수에 대해 모든 조합 가능한 수를 출력하면 된다. 소스코드 #include #include int N, M, visited[7], arr[7]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth){ for (int i = 0; i < N; i++){ visited[depth] = arr[i]; if(depth + 1 == M){ for (int idx = 0; idx < M; idx++) printf("%d ", visited[idx]); putchar(10); }else BT(depth + 1); } } i..

[백준 15655] N과 M (6) [C]

풀이 "백준 15664, N과 M (10)"에서 사용한 코드로 해결이 된다. 소스코드 #include #include #include bool check[8]; int N, M, arr[8], visited[8]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth, int start){ for (int i = start, temp = 0; i < N; i++) if (!check[i] && temp != arr[i]){ temp = visited[depth] = arr[i]; check[i] = true; if (depth + 1 == M){ for (int idx = 0; idx < M; i..

[백준 15664] N과 M (10) [C]

풀이 "백준 15663, N과 M (9)"를 참고해서 풀이했다. 요소의 중복은 temp와 check로 관리가 가능하니, 이전에 사용했던 요소의 인덱스를 탐색 시작점으로 이용하면 된다. 소스코드 #include #include #include bool check[8]; int N, M, arr[8], visited[8]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth, int start){ for (int i = start, temp = 0; i < N; i++) if (!check[i] && temp != arr[i]){ temp = visited[depth] = arr[i]; check[..

[백준 15663] N과 M (9) [C]

풀이 기존에 풀이하던 방식은 단순히 중복을 허용하거나 하지 않는 방식이라 이번 문제를 풀이하기에는 적합하지 않다. 때문에, 기존에 i번째 요소를 사용했는지, 기존에 사용한 숫자와 현재 사용하고자 하는 숫자가 다른지 확인하는 방식으로 풀이했다. 소스코드 #include #include #include bool check[8]; int N, M, arr[8], visited[8]; int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; } void BT(int depth){ for (int i = 0, temp = 0; i < N; i++) if (!check[i] && temp != arr[i]){ temp = visited[depth..

[백준 15988] 1, 2, 3 더하기 3 [C]

풀이 "백준 9095, 1, 2, 3 더하기"의 확장 문제이다. 1e6 까지 미리 구해놓자. 소스코드 #include const int MOD = 1e9+9; int dp[1000001] = {1, 2, 4}; int main(){ for (int i = 3; i < 1000001; i++) dp[i] = ((dp[i-1]+dp[i-2])%MOD +dp[i-3]) %MOD; int N, T; for (scanf("%d", &T); T--;){ scanf("%d", &N); printf("%d\n", dp[N-1]); } } 출처 및 참고자료 15988번: 1, 2, 3 더하기 3 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. ..