https://www.acmicpc.net/problem/2957
풀이: 트리의 루트에서 부터 왼쪽 오른쪽에 삽입할때 마다 높이를 1씩 증가시켜 준다. cin , cout을 사용할 경우 시간초과가 나므로 scanf, printf 를 사용하도록 하자 출력의 사이즈가 int 사이즈를 넘어가므로 long long 을 사용하자 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <iostream>#include <map>#include <algorithm>#include <stdio.h>using namespace std; int main(void) { int n, num; cin >> n; map<int, long long int> a; a[300001] = -1; a[0] = -1; long long temp = 0; for (int i = 0; i < n; i++) { scanf_s("%d", &num); a[num] = max((--a.
https://www.acmicpc.net/problem/2225
풀이: a[i][t] 는 0~i+1 까지 정수 t+1 개를 더하여 그 합이 i+1 이 되는 경우의 수 이다. a[i][t] = a[i-1][t] + a[i][t-1] 로 나타낼 수 있다. 이때 수의 값이 너무 커져 오버플로우가 발생할 수 있으므로 1000000000으로 나눈 나머지를 출력한다. 코드: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream>using namespace std; long long a[201][201]; int main(void) { int n, k; cin >> n >> k; for (int i = 0; i < n; i++) { a[i][0] = 1; for (int t = 1; t < k; t++) { if (i == 0) a[i][t] = t + 1; else a[i][t] = ((a[i - 1][t]) % 1000000000 + (a[i][t - 1]) % 1000000000) % 1000000000; } } cout << a[n - 1][k - 1] << endl; return 0; }