문제

https://www.acmicpc.net/problem/2775

풀이

층과 호수가 있는 아파트를 2차원로 볼 수 있다
0층에는 i호는 i명이 살도록 저장하고
1층에는 아랫층(k - 1)의 1호(index 0)에서 n호수까지 값을 더하면
현재 k층, n호의 사람수를 구할 수 있다
층, 호 입력은 14층 까지 받으므로 15x15로 만들어야 한다

Source

import java.util.Scanner;
public class Main {
     final static int MAX_ROW = 15;       //층
     final static int MAX_COL = 15;        //호
     static int[][] arr = new int[MAX_ROW][];
     public static void main(String[] args) {
           
           for(int row = 0; row < MAX_ROW; ++row)      //  배열초기화
                arr[row] = new int[MAX_COL];
                
           for(int row = 1; row < MAX_ROW; ++row)      // 1층  정보만 넣어주기
                arr[0][row] = row;
           
           for(int row = 1; row < MAX_ROW; ++row)      //  값넣어주기, 층
                for(int col = 1; col < MAX_ROW; ++col)// 호
                      for(int i = 0; i <= col; ++i)         //  처음~계산하는 호수 까지 값 계속 더하기
                           arr[row][col] += arr[row-1][i];
           
           Scanner sc = new Scanner(System.in);
           final int roop = sc.nextInt();
           
           int[][] test = new int[roop][];             // k, n 값  저장
           
           for(int i = 0; i < roop; ++i){
                test[i] = new int[2];
                test[i][0] = sc.nextInt();            // 층
                test[i][1] = sc.nextInt();            // 호
           }
     
           for(int i = 0; i < roop; ++i){
                int k = test[i][0];
                int n = test[i][1];
                System.out.println(arr[k][n]);
           }
     }
}

재귀함수로 각 사람인원 수 저장하는 소스

import java.util.Scanner;

public class Main {
	final static int MAX_ROW = 15; // 층 유저가 14층. 14호를 입력할 수 있으므로 15x15로 생성해야한다
	final static int MAX_COL = 15; // 호
	static int[][] arr = new int[MAX_ROW][];

	public static int GetValue(int col, int row, int index, int sum) {
		if (col + 1 == index) {
			return sum;
		}
		sum += arr[row][index];
		return GetValue(col, row, index + 1, sum);
	}

	public static void main(String[] args) {
		for (int row = 0; row < MAX_ROW; ++row) // 배열초기화
			arr[row] = new int[MAX_COL];
		for (int row = 1; row < MAX_ROW; ++row) // 1층 정보만 넣어주기
			arr[0][row] = row;
		for (int row = 1; row < MAX_ROW; ++row) // 값넣어주기, 층
			for (int col = 1; col < MAX_ROW; ++col) { // 호
				arr[row][col] = GetValue(col, row - 1, 0, 0);
			}
		Scanner sc = new Scanner(System.in);
		final int roop = sc.nextInt();
		int[][] test = new int[roop][]; // k, n 값 저장
		for (int i = 0; i < roop; ++i) {
			test[i] = new int[2];
			test[i][0] = sc.nextInt(); // 층
			test[i][1] = sc.nextInt(); // 호
		}
		for (int i = 0; i < roop; ++i) {
			int k = test[i][0];
			int n = test[i][1];
			System.out.println(arr[k][n]);
		}
	}
}