(Swift) 백준 2775 부녀회장이 될테야

SteadySlower·2022년 5월 18일
0

Coding Test

목록 보기
35/305

2775번: 부녀회장이 될테야

2차원 배열을 사용하는 방법

// 부녀회장이 될테야

// 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])
}
  1. k와 n의 최대 크기가 15밖에 안되므로 미리 모든 경우의 수를 구하고 시작했습니다.
  2. 2차원 배열을 이용한 문제입니다.

재귀함수를 사용하는 방법

다음 값을 구하기 위해 그 이전 값을 사용하는 방식 (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))
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글