콘텐츠로 이동

2022 02 18

2022-02-17

알고리즘 문제풀이 - 냅색 알고리즘

  • DP란?
    • 테이블로 기억하기 프로그래밍!
    • 더 좋은 방법으로 테이블을 갱신해나가자!
    • 작은 문제들을 풀어두고 값을 저장해뒀다가 재사용하는 기법!
  • DP의 일종!
    • DP 문제를 접근할 때에는 dy[i]를 만들어 특정 조건들을 기록하자!
      • ex. dy[i]: 금액 i를 만드는데 드는 최소 동전의 갯수
    • 기록을 더 해둠으로써 DFS (O(2^n)) 로 풀던 것을 DP (O(n^2)) 로 풀 수 있음!
  • 동전 문제
    • 잔액을 거슬러줘야하는데 어떤 동전들로 거슬러줄래? 1. DFS로 모든 경우의 수 따져서 푸는 법
      • "이걸 넣을까 말까"의 경우의 수 : O(2^n) 2. DP로 접근하는 방법
      • dy[i]: i를 만드는데 드는 최소의 동전 갯수를 기록해두자!
      • 동전의 갯수 하나씩 돌면서 해당 i원을 만드는데 최소의 동전갯수를 구하기
      • 경우의 수 : O(n^2)
  • 냅색 문제
    • 결국 이중 for문으로 돌아야해
      • 첫번째 for는 고려해야 할 조건 (동전의 갯수, 문제의 시간 등)
      • 두번째 for는 테이블 돌면서
    • 조건이 유한하다면 두 번째 for문 뒤 -> 앞!
    • 조건이 무한하다면 두 번째 for문 앞 -> 뒤!
      • j가 한문제만 풀게 하려면 뒤에서 부터 돌게 하라!