알고리즘/백트래킹

[백준/백트래킹/C++] 15661번 링크와 스타트 *

데메즈 2023. 1. 18. 09:22
728x90
반응형

https://www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100

www.acmicpc.net

계속 시간초과가 떠서 찾아봤는데 팀을 구성할 때

스타트팀 : 1,2 링크팀 : 3,4 일때와 스타트팀 : 3,4 링크팀 : 1,2 일때 두번 구해져서 그런 것이었다

void makeTeam(int tot){
    if(tot == n){
        compare();
        return;
    }

    isStartTeam[tot] = true; // tot번의 선수가 start팀에 있는 경우
    makeTeam(tot+1);
    isStartTeam[tot] = false; // tot번의 선수가 start팀에 없는 경우
    makeTeam(tot+1);
}

makeTeam() 함수는 그 조합을 구하는 함수이고  tot 변수는 팀 인원을 뜻하기도 하고 tot 번째 선수를 말하기도 한다.

1. tot 번째 선수가 start 팀에 있는 경우

2. tot 번째 선수가 start 팀에 없는 경우 에도 n번째까지 makeTeam 함수를 돌려서 최소값을 구한다

 

전체 코드
#include <bits/stdc++.h>

using namespace std;

int n;
int s[21][21];
bool isStartTeam[21]; // start팀 : true
int result = 2e9;

void compare(){ // 능력치 비교
    int pStart = 0, pLink = 0;

    for(int i=1; i<=n-1;i++){
        for(int j=i+1; j<=n; j++){

            if(isStartTeam[i] && isStartTeam[j])
                pStart += s[i][j] + s[j][i];
            else if(!isStartTeam[i] && !isStartTeam[j])
                pLink += s[i][j] + s[j][i];
        }
    }

    result = min(result, abs(pStart - pLink));
}

void makeTeam(int tot){
    if(tot == n){
        compare();
        return;
    }

    isStartTeam[tot] = true; // tot번의 선수가 start팀에 있는 경우
    makeTeam(tot+1);
    isStartTeam[tot] = false; // tot번의 선수가 start팀에 없는 경우
    makeTeam(tot+1);
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            cin >> s[i][j];
        }
    }

    makeTeam(0);

    cout << result;

    return 0;
}

 

관련 문제

https://develop-me-z.tistory.com/158

 

[백준/백트래킹/C++] 14889번 스타트와 링크 (삼성 SW 역량 테스트 기출)

문제집: 삼성 SW 역량 테스트 기출 문제 (baekjoon) www.acmicpc.net 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된

develop-me-z.tistory.com

 

728x90
반응형