각 아파트에 사는 사람을 표로 표현하면 다음과 같다.
1 |
16 |
136 |
… |
||||||||||
1 |
15 |
120 |
|||||||||||
1 |
14 |
105 |
|||||||||||
1 |
13 |
91 |
|||||||||||
1 |
12 |
78 |
|||||||||||
1 |
11 |
66 |
|||||||||||
1 |
10 |
55 |
|||||||||||
1 |
9 |
45 |
|||||||||||
1 |
8 |
36 |
|||||||||||
1 |
7 |
28 |
|||||||||||
1 |
6 |
21 |
|||||||||||
1 |
5 |
15 |
|||||||||||
1 |
4 |
10 |
20 |
35 |
56 |
81 |
107 |
152 |
207 |
273 |
351 |
442 |
547 |
1 |
3 |
6 |
10 |
15 |
21 |
28 |
36 |
45 |
55 |
66 |
78 |
91 |
105 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
첫번째 열을 제외하고 대각선 대칭이다.
3-3
4-6-4
5-10-10-5
6-15-20-15-6
7-21-35-35-21-7
...
따라서 n행 n열의 값은 n-1행 n열과 n행n-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 | #include <stdio.h> #define HOUSES 14 #define FLOORS 15 int main() { int apart[FLOORS][HOUSES]; int t, i, j; int k, n; /*initialize*/ for (i = FLOORS - 1; i >= 0; --i) apart[i][0] = 1; for (j = 1; j < HOUSES; ++j) apart[FLOORS - 1][j] = (j + 1); for (i = FLOORS -2; i >= 0; --i) { for (j = 1; j < HOUSES; ++j) { apart[i][j] = apart[i + 1][j] + apart[i][j - 1]; } } scanf("%d", &t); for (; t > 0; --t) { scanf("%d", &k); scanf("%d", &n); printf("%d\n", apart[FLOORS - 1 - k][n - 1]); } return 0; } | cs |
모든 호실에 각각 그 호실에 사는 사람의 수를 저장해 테이블을 형성하고
입력받은 층과 호수에 맞춰 테이블에서 읽어온다.
'Programming > Solutions' 카테고리의 다른 글
[Project Euler] Problem 008 (0) | 2019.03.25 |
---|---|
[BAEKJOON] 1152번 (0) | 2019.03.25 |
[BAEKJOON] 2292번 (0) | 2019.03.24 |
[BAEKJOON] 1924번 (0) | 2019.03.24 |
[Project Euler] Problem 007 (0) | 2019.03.24 |