알고리즘/BOJ

백준 2616번 소형기관차

꾸준함. 2018. 5. 13. 02:56

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


알고리즘 자체는 간단했습니다.

1. 해당 칸을 끌고 가지 않거나

2. 해당 칸을 최대 끌 수 있는만큼 끌고 간다.


그런데 여기서 간과한게 배열의 인덱스였습니다.

계속 런타임 에러가 떠도 도저히 이유를 모르겠었는데 배열 인덱스 범위 초과 때문이라는 것을 깨닫고

조건문에 if(idx + maxCarry - 1 <= passengerCarNum)를 추가하자 비로소 AC를 받았습니다.


좀 더 천천히 모든 조건을 고려하며 코딩을 해야겠습니다...


#include <iostream>

#include <algorithm>

#include <cstring> //memset

using namespace std;

 

const int MAX = 50000 + 1;

 

int passengerCarNum;

int passengerCar[MAX];

int maxCarry;

int cache[3][MAX]; //몇번째 소형 기차, 현재 객차 번호

 

int maxPassenger(int trainNum, int idx)

{

        //기저 사례 : 소형기차는 0, 1, 2 이렇게 세개이다

        //기저 사례 : 객차 칸 수를 벗어날 경우

        if (trainNum == 3 || idx >= passengerCarNum)

                 return 0;

 

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

        if (result != -1)

                 return result;

 

        result = 0;

        //해당 객차를 끌고 가지 않을 경우

        //해당 객차를 끌고 갈 경우

        if(idx + maxCarry - 1 <= passengerCarNum) //인덱스 범위를 초과해서 런타임에러 뜨는 것 같다

                 result = max(maxPassenger(trainNum, idx + 1), (passengerCar[idx + maxCarry - 1] - passengerCar[idx - 1]) + maxPassenger(trainNum + 1, idx + maxCarry));

        return result;

}

 

int main(void)

{

        cin >> passengerCarNum;

       

        for (int i = 1; i <= passengerCarNum; i++)

        {

                 int temp;

                 cin >> temp;

                 //나중에 구간 내 승객 수 세기 쉽게

                 passengerCar[i] = passengerCar[i - 1] + temp;

        }

 

        cin >> maxCarry;

 

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

 

        cout << maxPassenger(0, 1) << endl;

 

        return 0;

}


개발환경:Visual Studio 2017


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

반응형

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

백준 4883번 삼각그래프  (0) 2018.05.13
백준 2666번 벽장문의 이동  (0) 2018.05.13
백준 1652 누울 자리를 찾아라  (0) 2018.05.11
백준 1789번 수들의 합  (0) 2018.05.11
백준 15483번 최소 편집  (3) 2018.05.10