/images/logo.png

[백준]10164 격자상의 경로

https://www.acmicpc.net/problem/10164 풀이: N X M 행렬에서 K번째 수를 꼭 지나치면서 오른쪽 맨 아래까지 가는 최대 경우의 수 1~K 까지 가는 경우의 수 * K~M*N 까지 가는 경우의 수 DP[i][t] i행 t열로 갈 수 있는 경우의 수 DP[i][t] = DP[i-1][t] + DP[i][t-1] 코드: 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 #include <iostream>using namespace std; int a[16][16] = { 0 }; int b[16][16] = { 0 }; int main(void) { int n, m, k, q, w, e, r; cin >> n >> m >> k; q = k / m + 1; w = k%m; if (k !

[백준]11053 가장 긴 증가하는 부분 수열

https://www.acmicpc.net/problem/11053 풀이: 1965 상자넣기의 문제와 똑같으므로 링크를 참고 코드: 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 #include <iostream>#include <algorithm>using namespace std; int main(void) { int n, temp; cin >> n; int a[1001] = { 0 }; int b[1001]; for (int i = 0; i < n; i++) { cin >> a[i]; b[i] = 1; } for (int i = 0; i < n; i++) { temp = 0; for (int t = 0; t <= i; t++) { if (a[i] > a[i - t]) temp = max(b[i - t], temp); } b[i] += temp; } for (int i = 0; i < n; i++) { temp = max(b[i], temp); } cout << temp << endl; return 0; }

[백준]6603 로또

https://www.acmicpc.net/problem/6603 풀이: N 개의 로또 번호 중 6개를 선택하여 로또를 만드는 프로그램 6개의 번호를 사전순으로 하나씩 선택하면서 출력한다. 출력 사이사이에 빈칸을 만들어주고, 하나의 테스트 케이스가 끝나면 빈 줄을 하나 출력한다. 0이 출력되면 끝나므로 while 문 안에 if문으로 제한을 넣어준다. 코드: 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include <iostream>using namespace std; int a[13]; int main(void) { while (true) { int n; cin >> n; if (n == 0) break; for (int i = 0; i < n; i++) { cin >> a[i]; } int b[6] = { 0,1,2,3,4,5 }; while (true) { cout << a[b[0]] << " " << a[b[1]] << " " << a[b[2]] << " " << a[b[3]] << " " << a[b[4]] << " " << a[b[5]] << endl; if (b[0] >= n - 6) break; else if (b[1] >= n - 5) { b[0]++; for (int i = 0; i < 5; i++) { b[i + 1] = b[i] + 1; } } else if (b[2] >= n - 4) { b[1]++; for (int i = 1; i < 5; i++) { b[i + 1] = b[i] + 1; } } else if (b[3] >= n - 3) { b[2]++; for (int i = 2; i < 5; i++) { b[i + 1] = b[i] + 1; } } else if (b[4] >= n - 2) { b[3]++; for (int i = 3; i < 5; i++) { b[i + 1] = b[i] + 1; } } else if (b[5] >= n - 1) { b[4]++; b[5] = b[4] + 1; } else b[5]++; } cout << endl; } return 0; }

[백준]11060 점프 점프

https://www.acmicpc.net/problem/11060 풀이: cnt[i] 는 i번째 에서의 최소 가짓수 cnt를 모두 최댓값으로 채운 후 a[i] 이하의 값으로 점프할 때 마다 cnt[i + t] 값을 min(cnt[i + t], cnt[i] + 1) 로 해줌으로써 최소 가짓수를 찾는다 만약 도착점의 값이 처음 채운 1001과 같다면 갈 수 없는 경우이므로 -1을 출력한다. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream>#include <algorithm>using namespace std; int a[1001], cnt[1001]; int main(void) { int n; cin >> n; fill_n(cnt, n, 1001); for (int i = 0; i < n; i++) { cin >> a[i]; } cnt[0] = 0; for (int i = 0; i < n; i++) { for (int t = 1; t <= a[i]; t++) { cnt[i + t] = min(cnt[i + t], cnt[i] + 1); } } if (cnt[n - 1] == 1001) cout << "-1" << endl; else cout << cnt[n - 1] << endl; return 0; }

[백준]9084 동전

https://www.acmicpc.net/problem/9084 풀이: 첫번째 동전부터 경우의 수를 더해감. 코드: 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 #include <iostream>using namespace std; int coin[10001] = { 0 }; int main(void) { int n, a, num; cin >> n; for (int t = 0; t < n; t++) { fill_n(coin, 10000, 0); cin >> a; int *q = new int[a]; for (int i = 0; i < a; i++) { cin >> q[i]; } cin >> num; for (int i = 0; i <= num; i++) { if (i%q[0] == 0) coin[i]++; } for (int i = 1; i < a; i++) { for (int t = q[i]; t <= num; t++) { coin[t] += coin[t - q[i]]; } } cout << coin[num] << endl; } return 0; }

[백준]1904 01타일

https://www.acmicpc.net/problem/1904 풀이: a[i] 는 길이가 i인 모든 이진수열의 개수 a[i] = a[i - 1] + a[i - 2] 주어진 조건에 맞게 15746 으로 나눈 나머지를 출력 코드: 1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream>using namespace std; int a[1000001] = { 1,2 }; int main(void) { int n; cin >> n; for (int i = 2; i < n; i++) { a[i] = (a[i - 1] % 15746 + a[i - 2] % 15746) % 15746; } cout << a[n - 1] << endl; return 0; }