k번째 층의 n번째 호수의 주민의 수는
k-1층의 1 ~ n번째 호수의 주민 수의 합이다.
아래의 예를 보면 207호의 주민수는 28이다.
1 3 6 10 15 21 28
1 2 3 4 5 6 7
그리고 자세히 보면 k-1 층의 1 ~ n-1의 주민의합 + k-1층의 n호수 주민의 합이
k층의 n번쨰 호수이다. 혹은 k층 n-1 호수 주민 + k-1층의 n호수 주민의 합이 규칙이다.
하지만 본인은 아래와 같이 각 호수별로 주민수를 구해서
2차원 배열에 할당하여, 마지막에 해당 호수의 배열 원소를 추출하는 방법으로 풀이했다.
어차피, 위 규칙으로 구하나, 본인 방식이나 정답은 똑같지만, 코드의 간결성은
본인 방식이 더 낫다고 판단했다.
public class BJ_2775 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while(t > 0) {
int k = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
if (k < 1 || n > 14) return;
int[][] apt = new int[k + 1][n]; //아파트 배열 생성 / k+1 (0층 포함) 수만큼 층수 / n 수만큼 호수가 정해짐
int i = n; // 0층 주민 수 초기화 1 ~ n
while (i > 0) {
apt[0][--i] = i + 1;
}
//현재 층수에 전 층수들의 합을 넣음. s = storey, n = num
for (int s = 1; s <= k; s++) {
int residentsSum = 0; // s-1 층 층수의 총 주민 수 누적 합을 담는 변수
for (int r = 0; r < n; r++) {
residentsSum += apt[s - 1][r]; //s-1 층 r호수의 주민 수를 residentsSum 에누적시키고,
apt[s][r] += residentsSum; // s층 r호수에 삽입
}
}
System.out.println(apt[k][n - 1]); //k층 n-1호 (배열은 0부터)가 제출 응답.
--t;
}
}
}