[백준]2775 부녀회장이 될테야

서은경·2022년 11월 23일
0

CodingTest

목록 보기
37/71

이것은 나의 자존감 상승을 위한 브론즈 문제.. 다행히 맞았다! 사실 틀렸어도 기죽을 필요는 없다 더 공부하면 되니까!!!!! 요거슨 성공코드

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_2775 {
    static int count=0;
    static int[][] dp;
    public static void main(String[] args) throws IOException {
        // a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야한다
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.valueOf(br.readLine());     // 테스트 케이스 수
        int[] result = new int[T];
        for (int i = 0; i < T; i++) {
            count = 0;
            int k = Integer.valueOf(br.readLine());     // k층
            int n = Integer.valueOf(br.readLine());     // n호
            dp = new int[k+1][n+1];
            for (int j = 1; j <= n; j++) {
                dp[0][j] = j;
            }
            result[i] = dp(k, n);
        }

        for (int r : result) {
            System.out.println(r);
        }
    }
    public static int dp(int k, int n) {
        for (int i = 1; i <= k; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = dp[i][j-1]+dp[i-1][j];
                //System.out.println("dp["+i+"]["+j+"] = dp["+i+"]["+(j-1)+"] + dp["+(i-1)+"]["+j+"]");
                //System.out.println(dp[i][j]+" = "+dp[i][j-1]+" + "+dp[i-1][j]);
            }
        }
        return dp[k][n];
    }
}

/*
*
* 0층 1:1 2:2 3:3 4:4..
* 1층 1:1 2:3 3:6 4:10.. 2 3 4
* 2층 1:1 2:4 3:10 4:20.. 3 6 10
* 3층 1:1 2:5 3:15 4:35.. 4 10 20
*
* 직전 호수만큼씩 커진다
*
* */

풀이를 하자면.. 0층부터 k층의 n호까지 일일이 계산해봤다. 그랬더니 직전 층의 호수만큼씩 값이 증가하는 것을 확인할 수 있었다. 1층의 1호 2호 3호의 차이는 0층의 2호 3호 4호의 값만큼 증가했고 2층의 1호 2호 3호는 1층의 2호 3호 4호만큼 증가했다.
이걸 점화식으로 표현하니
d[i][j] = d[i][j-1] + d[i-1][j]
가 나온다는 것을 알 수 있었다.
일단 0층은 호수가 곧 인원수이므로 초기값으로 세팅해주고 점화식을 그대로 for문 안에 넣어 0층부터 k층 n호까지 값을 저장했다. bottom-up 방식 !

0개의 댓글

관련 채용 정보