TIL
[2023-10-02] TIL - 동적계획법
이즈흐
2023. 10. 2. 17:09
동적계획법
- 해결한 작은 문제로 큰 문제를 해결하는 문제 풀이 방식
-> 두가지 방법론이 있다.
- 메모이제이션
- 타뷸레이션
메모이제이션
- 하향식 접근법
- 동적 계획법에서작은 문제들의 결과는 항상 같다.
- 결과들을 메모리에 저장해 필요할 때 꺼내 쓰는 것이 메모이제이션
ex) 기존 백트래킹을 통한 피보나치 수열에서 중복되는 인자의 함수를 메모이제이션으로 미리 저장해 값을 빠르게 반환
f(n) = f(n-1) + f(n+1) -> 이처럼 규칙이 있다면 가능!
타뷸레이션
- 상향식 접근법
- 필요한 값들을 미리 계산해두는 것
- 메모이제이션은 필요할 때 계산하는 것, 타뷸레이션은 미리 계산하는 것
동적계획법 코딩테스트
https://programmers.co.kr/learn/courses/30/lessons/12983
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💢어려웠던 점
1. 효율성 테스트에서의 시간초과 - 문제의 조건
function solution(strs, t) {
var answer = 0;
let ans=Array(t.length+1).fill(0);
for(let i=1;i<t.length+1;i++){
ans[i]=Infinity
for(let j=1;j<i+1;j++){
let word = t.slice(i-j,i);
if(strs.indexOf(word)!==-1){
ans[i]=Math.min(ans[i],ans[i-j]+1)
}
}
}
console.log(ans)
return ans[ans.length - 1] === Infinity ? -1 : ans[ans.length - 1];
}
- 이는 문제에서 주어지는 "모든 단어 조각의 길이는 1이상 5이하입니다."를 잘 봐야한다.
...
for(let i=1;i<t.length+1;i++){
ans[i]=Infinity
for(let j=1;j<i+1;j++){
...
...
- slice를 위한 j 변수를 그저 i +1을 하는 것이 아닌 그 이상 커질 경우 6으로 고정 시키는 명령어가 필요하다.
- 아래와 같이 해결하면 효율성 테스트에서 성공할 수 있다.
for(let j=1;j<Math.min(i + 1, 6);j++){ ... }
2. 효율성 문제 - 문자열 검색
- 이는 주어진 문자열 strs에서 해당 문자가 존재하는지에 대해 검사하는 코드에서 효율성이 떨어지게 된다.
if(strs.indexOf(word)!==-1){
ans[i]=Math.min(ans[i],ans[i-j]+1)
}
- 이 코드를 다른 방식으로 바꿔줘야한다.
- 그래서 문자열을 검색할 때 빠른 효율을 위한 Set()을 사용해야한다.
const strsSet = new Set(strs);
...
if (strsSet.has(word)) {
ans[i] = Math.min(ans[i], ans[i - j] + 1);
}
3. 문제 도식화
728x90
반응형
LIST