// 부녀회장이 될테야
// i층 j호의 사람을 구하는 함수
func countPeople(i: Int, j: Int) -> Int {
var result = 0
for k in 1...j {
result += matrix[i - 1][k]
}
return result
}
// k와 n의 크기가 최대 14 밖에 안되므로 미리 전체 아파트의 사람수를 구하고 시작합니다.
// 2차원 배열 init
var matrix = Array(repeating: Array(repeating: 0, count: 15), count: 15)
// 1층의 i호에 i명의 사람이 산다.
for i in 1..<15 {
matrix[0][i] = i
}
// i층 j호의 사람을 미리 구한다.
for i in 1..<15 {
for j in 1..<15 {
matrix[i][j] = countPeople(i: i, j: j)
}
}
// 테스트 케이스를 받아서 출력한다.
let T = Int(readLine()!)!
(0..<T).forEach { _ in
let k = Int(readLine()!)!
let n = Int(readLine()!)!
print(matrix[k][n])
}
다음 값을 구하기 위해 그 이전 값을 사용하는 방식 (ex. 피보나치 수열)이므로 재귀함수를 이용한 풀이도 가능합니다.
다만 모든 경우의 수를 한번만 연산하는 이차원 배열의 방법과는 다르게 매번 연산을 해주어야 하므로 시간은 더 오래 걸립니다...
func countPeople(k: Int, n: Int) -> Int {
//⭐️ 재귀함수 탈출 조건
// 0층이라면 n호에는 n명이 산다 or 어떤 층이건 간에 1호라면 무조건 1명이 산다.
if k == 0 || n == 1 {
return n
}
//⭐️ k층 n호의 사람 수는 (k - 1)층 n호의 사람 수 + k층 (n - 1)호의 사람수
// 왜냐하면 k층 (n - 1)호에는 이미 (k - 1)층 1 ~ (n - 1)호의 사람수가 모두 더해져 있다.
// 따라서 (k - 1)층 1 ~ n호까지의 사람을 구하기 위해서는 (k - 1)층 n호의 사람수만 더해주면 된다.
return countPeople(k: k - 1, n: n) + countPeople(k: k, n: n - 1)
}
let T = Int(readLine()!)!
(0..<T).forEach { _ in
let k = Int(readLine()!)!
let n = Int(readLine()!)!
print(countPeople(k: k, n: n))
}