TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 땅따먹기
여의도사노비
2023. 1. 16. 20:24
728x90
이 문제는 꽤나 오래 걸려서 예제 답을 유추해냈는데...
막상 돌려보니 하나도 값이 안맞더라...ㅋㅋㅋㅋ 상당히 허무했던 문제였다.
왜 그럴까 하고 생각해보니 각 배열마다 중복된 max값이 존재할 경우를 고려하지 않았다는게 문제였다.
분명 고려하고자 아이패드에 써놨는데 코드 짜다보니... 잊어버렸나보다...
결론은 좀 어려워서 해설을 봤는데 DP(동적프로그래밍)에 관련된 문제였다.
https://school.programmers.co.kr/learn/courses/18/lessons/846
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스에 정말 내용이 잘 나와있으니 참고하면 좋을듯!
이 문제를 풀면서 생각한 논리적 흐름
- 결국 Tree처럼 하나씩 경우의 수를 따져가면서 끝까지 간다.
- i+1번째 배열중 0번째 위치한 값은 0을 제외한 다른 위치에서 오는 값들 중 가장 큰 값과 결합하면 된다.
- 그렇게 반복하여 land.count-1의 위치까지 내려오면 결국 land의 last 원소 중 가장 값이 큰 값이 답이된다.
* 코드
import Foundation
func solution(_ land:[[Int]]) -> Int{
var land = land
for i in 0..<(land.count-1) {
land[i+1][0] += max(land[i][1], land[i][2], land[i][3])
land[i+1][1] += max(land[i][0], land[i][2], land[i][3])
land[i+1][2] += max(land[i][0], land[i][1], land[i][3])
land[i+1][3] += max(land[i][0], land[i][1], land[i][2])
}
return land.last!.max()!
}
정리(Today I Learned)
- 동적프로그래밍: 최적화 이론의 한 기술이며, 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법이다.
(a,b)
|
그냥 계산 시 연산 횟수
|
동적 계획법 이용시 연산 횟수
|
(2,2)
|
5
|
4
|
(4,4)
|
69
|
16
|
(6,8)
|
3002
|
48
|
(10,10)
|
184755
|
100
|