#61. 백준 2275번 문제 풀이: 부녀회장이 될테야 문제 원본 보기
아파트에 거주하는 조건이 있다. "a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다" 는 계약 조항을 꼭 지키고 들어와야 한다. 계약조건에 따라 모두 거주한다면, k층 n호에 사는 사람의 수를 출력하시오. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. (1 ≤ k, n ≤ 14) 입력: 첫줄에 테스트 케이스 개수 T, 둘째줄 k(층수), 세째줄 n(호수), 다음줄 부터 k, n 반복 출력: 각 테스트 케이스에 대한 거주민 수 출력
입력/출력
--입력--
2
1
3
2
3
--출력--
6
10
문제풀이+해설
아파트 호수별 인원수를 도식화 해보면 아래와 같다.

층  1호 2호  3호  4호 ..
-------------------------
2   1    4   10   20 
1   1    3    6   10  ..
0   1    2    3    4  ..
-------------------------
규칙을 보면( 예) 2층 3호 라면)
층(2층)의 호수(3호)의 인원수(10명)는 아래층(1층) 호수(3호)의 인원수(6명) 과 같은층 앞호(2호) 인원수(4명)을 더한 값과 같다.
층/호가 배열로 되어 있다면 아래의 규칙이 성립니다.
 k층 n호의 인원수 = 배열[k][n] + 배열[k][n-1]
0층 부터 제시된 해당 층까지 해당층의 호별 인원수가 계산된 배열을 계산해 주면 된다.
바로 아래층의 인원수 데이터만 있으면 되므로, 한개층의 배열만 있으면 된다. 

유의할 것은 0층의 경우에는 위의 규칙을 따르지 않고, 별도 계산없이, 호수가 인원수이므로, if 문으로 별도 처리해 줘야 한다.
code sol.
#include <stdio.h>

int main() {
  int r, i, j, T, k, n, end;
  int ms[15]; // 호수별 인원수를 저장할 배열, 
  scanf("%d", &T); // 테스트 케이스 개수를 정수로 변환해서 받는다.
  for(r = 0; r < T; r++) { // 테스트 개수 만큼 루프
    scanf("%d", &k); // k(층수) 를 받는다.
    scanf("%d", &n); // n(호수) 를 받는다.
    if(k == 0) { // 0 층일 경우 호수가 인원수이므로 인원수 출력 후 끝냄 
      printf("%d\n", n);
      continue;  // 찾았으니, 다시 앞으로 보내서 추가 루프
    }
    // 층수가 0보다 크면 계속 진행
    for(i = 0; i < 15; i++) ms[i] = i; // 호수별 인원, 0층값으로 초기화
    end = 0; // 테스트 케이스 한개의 루프 끝났는지 확인
    for(i = 1; i < k + 1; i++) { // 1층 부터, 해당층 까지 반복 계산
      for(j = 1; j < n + 1; j++) { // 1호 부터 끝호까지 더해줌
        ms[j] += ms[j - 1]; // 이전 호수 인원 + 아래층 호수 인원 = 현재 호수이원이 된다.
        if(i == k && j == n) { // 찾는 층, 호수이면 출력후 끝낸다.
          printf("%d\n", ms[j]); // 찾은 인원수 출력
          end = 1; // 현재 루프 끝내라는 표시
          break; // 찾았으니 현재 루프 종료
        }
      }
      if(end == 1) break; // 찾았으니 현재 루프 종료
    }
  }
  return 0;
}
© 코드솔 - CodeSol. All Rights Reserved.