알고리즘/BOJ

백준 7579번 앱

꾸준함. 2018. 6. 18. 15:12

문제 링크입니다: https://www.acmicpc.net/problem/7579


처음에는 가격을 기준으로 인덱스와 총 메모리양으로 메모이제이션을 시도하다가 메모리 초과로 실패했던 문제였습니다.

100문제를 넘게 풀었지만 여전히 메모리 초과 에러는 컴파일해야지만 알 수 있는 초보는 웁니다 ㅠㅠ


그 다음에도 여전히 가격을 기준으로 인덱스와 총 가격으로 메모이제이션을 시도해서 테스트 케이스까지는 맞았지만 시스템 케이스에서 틀려 왜맞틀 문제가 되었습니다.


두 번째 시도까지 틀리고 곰곰히 생각해보니 확보할 메모리양이 정확히 M이 아니라 M 이상이라는 것을 파악했습니다.

확보해야할 메모리 양이 M 이상이기 때문에 총 메모리양을 기준으로 인덱스와 가격으로 메모이제이션을 진행한 다음,

총 가격을 순차적으로 증가시키면서 최초로 M 이상이 나오는 가격을 찾으면 되는 문제였습니다.


#include <iostream>

#include <algorithm>

#include <cstring> //memset

using namespace std;

 

const int MAX = 100;

const int MAXCOST = 10000 + 1;

 

int N, M;

int memory[MAX];

int cost[MAX];

int cache[MAX][MAXCOST];

 

//메모리를 메모이제이션(10,000,000 너무 크다)

int maxMemory(int idx, int totalCost)

{

        //기저 사례: 범위 초과 시

        if (idx >= MAX)

                 return 0;

 

        int &result = cache[idx][totalCost];

        if (result != -1)

                 return result;

       

        result = maxMemory(idx + 1, totalCost); //해당 앱 비활성화 안 시켰을 경우

        //totalCost보다 해당 인덱스에 있는 앱의 비활성화 가격이 같거나 작다면

        //비활성화 안 했을 때와 비활성화 했을 때와 비교해서 메모리가 더 큰 쪽 선택

        if (cost[idx] <= totalCost)

                 result = max(result, memory[idx] + maxMemory(idx + 1, totalCost - cost[idx]));

        return result;

}

 

int main(void)

{

        cin >> N >> M;

 

        for (int i = 0; i < N; i++)

                 cin >> memory[i];

        for (int i = 0; i < N; i++)

                 cin >> cost[i];

 

        memset(cache, -1, sizeof(cache));

       

        int totalCost = 0;

        //0부터 시작해서 최초로 M 바이트 이상 확보 시 답 찾음

        while (1)

        {

                 if (maxMemory(0, totalCost) >= M)

                 {

                         cout << totalCost << endl;

                         break;

                 }

                 totalCost++;

        }

 

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1966번 프린터 큐  (0) 2018.06.18
백준 6603번 로또  (10) 2018.06.18
백준 2688번 줄어들지 않아  (0) 2018.06.17
백준 15724번 주지수  (0) 2018.06.17
백준 15723번 n단 논법  (0) 2018.06.17