Skip to content

Conversation

@alirz-pixel
Copy link
Member

@alirz-pixel alirz-pixel commented Jan 6, 2026

🚀 이슈 번호

Resolve: {#2274}

🧩 문제 해결

스스로 해결:

🔎 접근 과정

문제 해결을 위한 접근 방식을 설명해주세요.

  • 🔹 어떤 알고리즘을 사용했는지: 브루트포스 + 백트래킹
  • 🔹 어떤 방식으로 접근했는지

리그 방식으로 진행되므로, 재귀 또한 리그 방식으로 구현하였다.
즉, src를 기준으로 src+1~6까지 대결하도록 하였으며,

src vs dst와의 대결에서 "승리", "무승부", "패배" 케이스에 대해 진행하면서 배틀했을 때,
남은 승리, 패배, 무승부 카운트가 0이면 가능한 결과가 되도록 진행하였다.

⏱️ 시간 복잡도

시간 복잡도 분석을 작성해주세요.
최악의 경우 수행 시간은 어느 정도인지 분석합니다.

  • Big-O 표기법: $O(3^{\binom{n}{2}})$
  • 이유:

리그 방식에 대한 경우의 수는 $\binom{n}{2}$로 이며,
또한 각 경우에 대해 "패배", "무승부", "승리" 케이스로 분기된다.

따라서 총 시간복잡도는 $O(3^{\binom{n}{2}})$이다.

💻 구현 코드

#include <iostream>
#include <vector>

using namespace std;

struct Info {
    int win;
    int draw;
    int lose;
};

bool recursive(vector<Info> &infos, int src, int dst) {
    if (src == 6) {
        for (int i = 0; i < 6; i++) {
            if (infos[i].win)
                return false;
            if (infos[i].draw)
                return false;
            if (infos[i].lose)
                return false;
        }
        return true;
    }
    
    if (dst == 6)
        return recursive(infos, src + 1, src + 2);

    // src vs dst
    bool is_true = false;
    // 승리
    if (infos[src].win && infos[dst].lose) {
        infos[src].win--;
        infos[dst].lose--;
        is_true = recursive(infos, src, dst + 1);
        infos[src].win++;
        infos[dst].lose++;
    }
    if (is_true)
        return true;

    // 무승부
    if (infos[src].draw && infos[dst].draw) {
        infos[src].draw--;
        infos[dst].draw--;
        is_true = recursive(infos, src, dst + 1);
        infos[src].draw++;
        infos[dst].draw++;
    }
    if (is_true)
        return true;

    // 패배
    if (infos[src].lose && infos[dst].win) {
        infos[src].lose--;
        infos[dst].win--;
        is_true = recursive(infos, src, dst + 1);
        infos[src].lose++;
        infos[dst].win++;
    }
    if (is_true)
        return true;
    return false;
}

int main() {
    for (int tc = 0; tc < 4; tc++) {
        vector<Info> infos(6);
        for (int i = 0; i < 6; i++)
            cin >> infos[i].win >> infos[i].draw >> infos[i].lose;

        bool is_true = recursive(infos, 0, 1);
        cout << (is_true ? 1 : 0) << " ";
    }

    return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

260106 : 코딩테스트

2 participants