BOJ 11053 가장 긴 증가하는 부분 수열
✅ dp라는데 진짜 어려웠다.
우선 알고리즘 풀이법이 이해가 가지 않았다.
주어진 값이 10 20 10 30 20 50 있다고 가정하자.
list | 10 | 20 | 10 | 30 | 20 | 50 |
dp | 1 | 2 | 1 | 3 | 2 | 4 |
코드를 보면 이해할 수 있는데, 어떤 수를 기준으로 나보다 작은 수를 비교한다.
나를 기준으로 내 앞을 비교한다. 나보다 작은 수(j)라고 하면 dp[j]는 dp[j]보다 작은 값들이 몇개 있는지 저장한다. 그게 가장 긴 부분 수열의 합이기 때문이다.
제일 중요한 것은 실제 문제 풀이에서 이를 떠올려야 한다는 점이다. 그렇다면 점화식을 어떻게 생각할 수 있을까?dp문제의 경우에는 그냥 손으로 쓰다보면 특정한 패턴을 찾을 수 있다.list를 놓고, 나보다 작은 수를 서칭하자라는 패턴을 찾았다면 아래에 dp테이블을 두어서 쉽게 해결할 수 있었을 것이다.
✅ 코드
let input: Int = Int(readLine()!)!
let input2 = readLine()
var list = [Int]()
list = input2!.components(separatedBy: " ").map{ Int($0)! }
var dp = [Int](repeating: 1, count: 1001)
for i in 0..<list.count {
for j in 0..<i {
if list[j] < list[i] {
dp[i] = max(dp[i], dp[j]+1)
}
}
}
print(dp.max()!)
'알고리즘 문제 풀이' 카테고리의 다른 글
[Swift] 프로그래머스 LV2. 가장 큰 수 (0) | 2022.04.02 |
---|---|
[Swift] BOJ 1932 정수 삼각형 (0) | 2022.04.01 |
[Swift] BOJ 2579 계단 오르기 (0) | 2022.04.01 |
[Swift] BOJ 9095 1,2,3더하기 (0) | 2022.04.01 |
[Swift] 프로그래머스 LV2. 땅따먹기 (0) | 2022.04.01 |