내가 생각했을때 문제에서 원하는부분
첫째 줄에 정수 n과 k가 빈칸을 사이에 두고 차례로 주어진다.
이 때, 1 ≤ k ≤ n ≤ 30을 만족한다.
첫째 줄에 n번째 행에 있는 k번째 수를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 표준 입력에서 데이터를 읽는다.
StringTokenizer를 사용하여 첫 줄에서 읽어온 문자열을 공백으로 분리하여 n과 k 값을 읽는다.
pascal이라는 이름의 2차원 배열을 선언합니다. n의 최대값이 30이므로 n x n 크기로 충분하다.
이 배열에 파스칼의 삼각형 각 위치의 값을 저장한다.
파스칼의 삼각형 첫 번째 행 (pascal[0][0])을 1로 초기화한다.
두 번째 행부터 n번째 행까지 반복하며 값을 계산한다.
각 행 i의 첫 번째 (pascal[i][0])와 마지막 (pascal[i][i]) 값은 1로 설정한다.
for (int j = 1; j < i; j++) 루프를 통해 각 행의 중간 값들을 계산해준다.
파스칼의 삼각형 규칙에 따라 pascal[i][j]의 값은 바로 위 행 (i-1)의 인접한 두 수인 pascal[i-1][j-1]와 pascal[i-1][j]의 합으로 결정된다.
모든 값이 계산되면, 문제에서 요구하는 n번째 행의 k번째 수는 0부터 시작하는 인덱스에서 pascal[n-1][k-1]에 해당하므로 해당 값을 출력해준다.
코드로 구현
package baekjoon.baekjoon_28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 16395번 문제
public class Main1013 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
// 파스칼의 삼각형 값을 저장할 2차원 배열
// n번째 행에는 n개의 수가 있으므로 크기를 n x n으로 설정 (넉넉하게)
int[][] pascal = new int[n][n];
// 첫 번째 행 초기화
pascal[0][0] = 1;
// 두 번째 행부터 n번째 행까지 계산
for (int i = 1; i < n; i++) {
// 각 행의 첫 번째와 마지막 수는 1
pascal[i][0] = 1;
pascal[i][i] = 1;
// 중간 값 계산: 위 행의 인접한 두 수의 합
for (int j = 1; j < i; j++) {
pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];
}
}
// n번째 행의 k번째 수 출력 (0-based index로 n-1번째 행의 k-1번째 값)
System.out.println(pascal[n - 1][k - 1]);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.