반응형
문제
풀이
이 문제는 다이나믹 프로그래밍 기법을 사용해서 쉽게 풀이할 수 있습니다.
먼저, 0층의 i호에는 i명이 산다. 라는 문제의 지문을 이용해서 0층, 1층, 2층... 바텀업 방식으로 답을 도출할 수 있다는 아이디어를 얻을 수 있습니다.
4호까지 있다고 가정하고 DP 테이블을 어떤식으로 채워나갈지 확인해보시죠..!
2층 3호는 어떤식으로 채워줘야 할까요??
2층 3호 = 1층 1호 + 1층 2호 + 1층 3호 일 것입니다.
n층 1호는 0층 1호가 1이기 때문에, 무조건 1이 될 수 밖에 없습니다.
1층 2호 = 0층 1호 + 0층 2호 겠죠??
하지만 이것은 1층 1호 + 0층 2호 라고 해도 되겠죠??
1층 3호는 어떨까요??
1층 3호 = 0층 1호 + 0층 2호 + 0층 3호 겠네요.
0층 1호 + 0층 2호 = 1층 2호
이기 때문에 1층 3호 = 1층 2호 + 0층 3호 가 되겠네요.
y=층,x=호
초기값:f(0,x)=x,f(y,1)=1
f(y,x)=f(y,x−1)+f(y−1,x)
의 점화식이 성립하게 됩니다!
이제 총 14층 14호까지의 dp 테이블을 채워주기만 하고 출력해주면 되겠네요!
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var cache = [[Int]](repeating: [Int](repeating: 0, count: 15), count: 15) | |
for i in 1...14 { | |
cache[0][i] = i | |
cache[i][1] = 1 | |
} | |
for i in 1...14 { | |
for j in 2...14 { | |
cache[i][j] = cache[i - 1][j] + cache[i][j - 1] | |
} | |
} | |
let t = Int(readLine()!)! | |
for _ in 0..<t { | |
let k = Int(readLine()!)! | |
let n = Int(readLine()!)! | |
print(cache[k][n]) | |
} |
후기
0층부터 차근차근 채워보면서 규칙을 찾고, 초기 값과 점화식을 세우기만 하면 쉽게 풀 수 있는 문제인 것 같습니다.
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 10757 큰 수 A + B (Swift) (0) | 2023.01.28 |
---|---|
[BOJ] 백준 2839 설탕 배달 (Swift) (0) | 2023.01.26 |
[BOJ] 백준 10250 ACM 호텔 (Swift) (0) | 2023.01.18 |
[BOJ] 백준 2869 달팽이는 올라가고 싶다 (Swift) (0) | 2023.01.17 |
[BOJ] 백준 1193 분수찾기 (Swift) (0) | 2023.01.15 |