문제 링크

#include <bits/stdc++.h>

using namespace std;

vector<int> p = { 1, 2, 3, 4, 5, 6, 7, 8 };
vector<vector<int>> scbd;
int n, iidx;

int calc(int num, vector<int>& base) {
    if (!num)
        return -1;
    int score = 0;
    for (int i = 0; i < num; i++) {
        /*base.push_back(!i); // vector가 deque보다 훨씬 빠르다
        score += base.front();
        base.pop_front();*/
        score += base[2];
        base[2] = base[1];
        base[1] = base[0];
        base[0] = !i;
    }
    return score;
}

int run_simul(const vector<int>& lst) {
    int ret = 0;
    int    pidx = 0; // 선수 인덱스
    // 현 선수 리스트로 모든 이닝을 순회
    for (int inning = 0; inning < n; inning++) {
        int out = 0, t;
        vector<int> base(3, 0);
        while (out < 3) {
            //base[0] = base[1] = base[2] = 0;
            t = calc(scbd[inning][lst[pidx]], base);
            if (t == -1)
                out++;
            else
                ret += t;
            pidx = (pidx + 1) % 9;
        }

        //if (ret == 43)
            //cout << " ";
    }
    return ret;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n;
    scbd.resize(n, vector<int>(9, 0));

    for (auto& a : scbd)
        for (auto& b : a)
            cin >> b;

    int ret = 0, inning = 0;
    time_t st, ed;
    st = clock();
    do {
        vector<int> lst;
        lst.insert(lst.end(), p.begin(), p.begin() + 3);
        lst.push_back(0);
        lst.insert(lst.end(), p.begin() + 3, p.end());

        ret = max(ret, run_simul(lst));
    } while (next_permutation(p.begin(), p.end()));
    ed = clock();
    cout << ret << "\n";
    cout << ed - st << "\n";
}
vector가 deque보다 훨씬 빠름!  위에서 부터  deque 이용, deque index활용, vector이용,

9
1 2 4 3 0 2 1 0 3
1 2 1 2 0 0 0 0 1
3 4 2 3 1 2 3 4 0
0 1 2 3 4 2 1 0 0
0 0 0 0 0 0 1 4 4
0 4 0 4 0 4 0 4 0
0 4 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 0
0 2 0 3 0 1 0 2 0
89
254

C:\Users\User\source\repos\profile01\Baekjoon\x64\Release\17281.exe(6076 프로세스)이(가) 0 코드로 인해 종료되었습니다.
이 창을 닫으려면 아무 키나 누르세요.

9
1 2 4 3 0 2 1 0 3
1 2 1 2 0 0 0 0 1
3 4 2 3 1 2 3 4 0
0 1 2 3 4 2 1 0 0
0 0 0 0 0 0 1 4 4
0 4 0 4 0 4 0 4 0
0 4 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 0
0 2 0 3 0 1 0 2 0
89
150

C:\Users\User\source\repos\profile01\Baekjoon\x64\Release\17281.exe(2944 프로세스)이(가) 0 코드로 인해 종료되었습니다.
이 창을 닫으려면 아무 키나 누르세요.

9
1 2 4 3 0 2 1 0 3
1 2 1 2 0 0 0 0 1
3 4 2 3 1 2 3 4 0
0 1 2 3 4 2 1 0 0
0 0 0 0 0 0 1 4 4
0 4 0 4 0 4 0 4 0
0 4 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 0
0 2 0 3 0 1 0 2 0
89
73

C:\Users\User\source\repos\profile01\Baekjoon\x64\Release\17281.exe(11560 프로세스)이(가) 0 코드로 인해 종료되었습니다.
이 창을 닫으려면 아무 키나 누르세요.

insert를 사용안하면 속도를 더 단축할 수 있다.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N; cin >> N;
    int score = 0;
    int player[50][9];
    int chance[4];
    for(int i = 0; i < N; i++)
        for(int j = 0; j < 9; j++) {
            cin >> player[i][j];
        }
    int curidx[8];
    for(int j = 0; j < 8; j++)
        curidx[j] = j+1;

        do {
            memset(chance, 0 ,sizeof(chance));
            int idx[9];
            int out = 0;
            int prevscore = 0;
            int inning = 0;

            for(int i = 0; i < 3; i++)
                idx[i] = curidx[i];
            for(int i = 3; i < 8; i++)
                idx[i+1] = curidx[i];
            idx[3] = 0;

            int start = 0;
            while(inning < N) {
                int p = player[inning][idx[start]];
                if(p != 0) {
                    for(int k = 3; k >= 1; k--) {
                        if(chance[k] == 1) {
                            if(k+p >= 4) prevscore++;
                            else chance[k+p] = 1;
                            chance[k] = 0;
                        }
                    }
                    if(p == 4) prevscore++;
                    else chance[p] = 1;

                }
                else out++;

                if(out==3) {
                    out = 0;
                    inning++;
                    memset(chance, 0 , sizeof(chance));
                }
                start = (start+1)%9;
            }
            score = max(score,prevscore);
        } while(next_permutation(curidx, curidx+8));
    cout<<score;
    return 0;
}

17281-Result

댓글남기기