요구능력 : 규칙을 통해 DP를 사용해야할지를 아느냐
코드설명 :
2 x 2 ~ 2 x 4까지 그림을 그려보자.
규칙을 찾아보면 아래와 같다.
보다시피 위의 세로막대기가 왼쪽에 1개 있는건 n-1개가 나온다.
아래의 가로막대기가 왼쪽에 2개 있는건 n-2개가 나온다.
여기서 DP를 해야겠다는 생각이 어떻게 나오냐?
1. 문제가 연속적이다.
2. 중복되는 부분문제가 있다. ( f(5)를 구하려면 f(4)와 f(3)을 구해야하는데 f(4)를 구하려면 f(3)을 또 구해야하는 것을 말한다.)
후기 : 규칙을 찾고 DP개념만 알고있으면 풀 수 있는 문제
let n = Int(readLine()!)!
var dp = Array(repeating: 0, count: 1001)
dp[1] = 1
dp[2] = 2
for i in stride(from: 3, through: n, by: 1) {
dp[i] = (dp[i - 1] + dp[i - 2]) % 10007
}
print("\(dp[n])")
'Algorithm > 문제풀이_백준' 카테고리의 다른 글
Swift) 백준 9095번 (1, 2, 3 더하기) (0) | 2021.08.29 |
---|---|
Swift) 백준 11727 (2 x n타일링2) (0) | 2021.08.29 |
Swift) 백준 1463번 (1로 만들기) (0) | 2021.08.28 |
Swift) 백준 1476번 (날짜 계산) (0) | 2021.08.26 |
Swift) 백준 2309번 (일곱 난쟁이) (0) | 2021.08.26 |
댓글