규칙은 거창한 것이 아니다..
찾은 규칙이 있다면 평범하다고 무시하지 말자.
# 풀이
몇 개 층을 나열해보면 규칙을 찾을 수 있다.
층수 | 호실별 인원 |
---|---|
0 | 1 2 3 4 5 ... |
1 | 1 3 6 10 15 ... |
2 | 1 4 10 20 35 ... |
3 | 1 5 15 35 70 ... |
... | ... |
처음엔 세로 줄의 규칙을 찾아봤다가 3호실까지 규칙밖에 못찾아서 포기했다.
쭉 계산을 하다보면 현재 호실 값이 같은 층 이전 호실과 이전 층 같은 호실의 합이라는 것을 발견할 수 있다.
이 규칙을 활용해 처음에는 n층과 m방 값을 받아 그 층과 그 방까지만 계산하려고 했는데, 생각해보니 동일한 값인데 테스트 케이스마다 새로운 값을 넣는 것은 비효율적이라 한번에 전체를 계산하도록 했다.
먼저 0층과 1번방을 채워준다.
0층은 방 번호와 인원이 동일하고, 1번방들은 모두 1이다.
이후 n층의 m번방은 n-1층 m번방 + n층 m-1번방
이므로 그 값을 넣어준다.
각 테스트 케이스에서는 nFloor
nRoom-1
번째를 읽어들이면 완성이다!
# 코드
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int nTestCase = sc.nextInt();
int[][] apart = new int[15][15];
for(int i = 0; i < 15; i++) {
apart[i][0] = 1;
apart[0][i] = i + 1;
}
for(int i = 1; i < 15; i++) {
for(int j = 1; j < 15; j++) {
apart[i][j] = apart[i-1][j] + apart[i][j-1];
}
}
for(int i = 0; i < nTestCase; i++) {
int nFloor = sc.nextInt();
int nRoom = sc.nextInt();
System.out.println(apart[nFloor][nRoom - 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
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