/images/logo.png

[백준]2156 포도주 시식

https://www.acmicpc.net/problem/2156 풀이: b[i][0] 은 i번째를 골랐을 때, i-1번째를 안고른 경우의 수 b[i][1] 은 i번째를 골랐을 때, i-1번째를 고른 경우의 수 b[i][2] 은 i번째를 골랐을 때, i-2번째를 안고른 경우의 수 코드: 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 #include <iostream>#include <algorithm>using namespace std; int main(void) { int n; cin >> n; int a[10001]; for (int i = 0; i < n; i++) { cin >> a[i]; } int b[10001][3] = { a[0],a[0],a[0],a[1],a[0] + a[1],a[1],0 }; int temp; for (int i = 2; i < n; i++) { for (int t = 0; t < 3; t++) { if (t == 0) { temp = max(b[i - 2][0], b[i - 2][1]); b[i][t] = max(temp, b[i - 2][2]) + a[i]; } if (t == 1) b[i][t] = max(b[i - 1][0], b[i - 1][2]) + a[i]; if (t == 2) b[i][t] = b[i - 3][1] + a[i]; } } temp = max(b[n - 1][0], b[n - 2][1]); temp = max(temp, b[n - 1][1]); cout << max(temp, b[n - 1][2]) << endl; return 0; }

[백준]1003 피보나치 함수

https://www.acmicpc.net/problem/1003 풀이: 0이 쓰이면 카운트 0을 ++ 1이 쓰이면 카운트 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 #include <iostream> // 재귀를 이용using namespace std; int cnt[2] = { 0 }; int fibonacci(int n) { if (n == 0) { cnt[0]++; return 0; } else if (n == 1) { cnt[1]++; return 1; } else return fibonacci(n-1) + fibonacci(n-2); } int main(void) { int T,n; cin >> T; for (int i = 0; i < T; i++) { cin >> n; cnt[0] = 0; cnt[1] = 0; fibonacci(n); cout << cnt[0] << " " << cnt[1] << endl; } return 0; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <iostream> // 포문 이용using namespace std; int main(void) { int T, n; int a[41] = { 0 }; int b[41] = { 0 }; cin >> T; for (int i = 0; i < T; i++) { cin >> n; a[0] = 1; a[1] = 0; b[0] = 0; b[1] = 1; for (int t = 2; t <= n; t++) { a[t] = a[t - 1] + a[t - 2]; b[t] = b[t - 1] + b[t - 2]; } cout << a[n] << " " << b[n] << endl; } }

[백준]11726 2×n 타일링

https://www.acmicpc.net/problem/11726 풀이: 정수 i를 1,2 의 조합으로 나타낼 수 있는 경우의 수 a[i-1] a[i] = a[i-1] + a[i-2] 으로 구할 수 있다. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream>using namespace std; int main(void) { int n; int a[1001] = { 1,2,0 }; cin >> n; for (int t = 2; t < n; t++) { a[t] = (a[t - 1] + a[t - 2]) % 10007; } cout << a[n - 1]<< endl; return 0; }

[백준]1463 1로 만들기

https://www.acmicpc.net/problem/1463 풀이: i 일때 연산 횟수를 a[i] 라고 둔다. 2와 3으로 동시에 나눠질때, 따로 나눠질때, 나눠지지 않을때로 나눠서 계산한다. n번까지 연산 후 a[n]을 출력한다. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream>#include <algorithm>using namespace std; int a[1000002] = { 0 }; int main(void) { int n; cin >> n; for (int i = 2; i <= n; i++) { if (i % 2 == 0 && i % 3 == 0) { int temp = min(a[i / 2], a[i / 3]); a[i] = min(temp, a[i - 1]) + 1; } else if(i % 2 == 0 && i % 3 !

[백준]9095 1, 2, 3 더하기

https://www.acmicpc.net/problem/9095 풀이: 정수 i를 1,2,3의 조합으로 나타낼 수 있는 경우의 수 a[i-1] a[i] = a[i-1] + a[i-2] + a[i-3] 으로 구할 수 있다. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream>using namespace std; int main(void) { int T,n; cin >> T; for (int i = 0; i < T; i++) { int a[11] = { 1,2,4,0 }; cin >> n; for (int t = 3; t < n; t++) { a[t] = a[t - 1] + a[t - 2] + a[t - 3]; } cout << a[n - 1] << endl; } return 0; }

[백준]1149 RGB거리

https://www.acmicpc.net/problem/1149 풀이: r,g,b를 각각 b[0], b[1], b[2] 로 둠. r을 선택했다면 이전에서 g,b 중 작은값에 이번에 r값을 더하는 식으로 r,g,b 반복 r,g,b 최종값에서 가장 최소값 출력 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <iostream>#include <algorithm>using namespace std; int main(void) { int n; cin >> n; int a[3001]; int b[3]; for (int i = 0; i < n*3; i++) { cin >> a[i]; } for (int i = 1; i < n; i++) { b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; a[0] = min(b[1], b[2]) + a[i * 3]; a[1] = min(b[0], b[2]) + a[(i * 3) + 1]; a[2] = min(b[0], b[1]) + a[(i * 3) + 2]; } int temp = min(a[0], a[1]); cout << min(temp, a[2]) << endl; return 0; }