둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (217) N
    • BOJ (170) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13) N
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (4) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/백트래킹

14889번: 스타트와 링크

2025. 6. 4. 13:03

14889번: 스타트와 링크

사용 언어: C++

 

문제 요약

총 N명의 사람이 있고, 이들을 두 팀(스타트 팀, 링크 팀)으로 나눈다. 각 팀에 속한 사람들의 능력치 합 차이를 최소화하는 것이 목표.

  • 능력치는 2차원 배열 S[i][j]로 주어지며,
    i번과 j번이 같은 팀일 때 더해지는 값은 S[i][j] + S[j][i].
  • N은 항상 짝수이며, 두 팀은 N/2명씩 구성돼야 함.

풀이

1. 조합을 통해 팀을 나눈다

  • N명 중 N/2명을 선택해서 스타트 팀을 구성하면,
  • 나머지 인원은 자동으로 링크 팀이 된다.
    → 즉, 전체 경우의 수는 NC(N/2) 개의 조합.

2. 각 조합에 대해 능력치 차이 계산

  • 스타트 팀의 능력치 = sum(S[i][j] + S[j][i]) (for i, j in 스타트 팀)
  • 링크 팀도 동일하게 계산
  • 두 팀의 차이의 절댓값을 구해 최소값을 갱신한다

3. 백트래킹으로 조합 구성

  • 중복 없이 N/2명 뽑기 위해 next 인덱스를 통해 재귀적으로 조합 생성
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int N, S[21][21], ans = 1e9;
vector<int> team;

void dfs(int idx, int depth) {
    if (depth == N / 2) {
        vector<int> start, link;

        for (int i = 0; i < N; i++) {
            if (find(team.begin(), team.end(), i) != team.end())
                start.push_back(i);
            else
                link.push_back(i);
        }

        int startSum = 0, linkSum = 0;
        for (int i = 0; i < N / 2; i++) {
            for (int j = 0; j < N / 2; j++) {
                startSum += S[start[i]][start[j]];
                linkSum += S[link[i]][link[j]];
            }
        }

        ans = min(ans, abs(startSum - linkSum));
        return;
    }

    for (int i = idx; i < N; i++) {
        team.push_back(i);
        dfs(i + 1, depth + 1);
        team.pop_back();
    }
}

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

    cin >> N;
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            cin >> S[i][j];

    dfs(0, 0);
    cout << ans;
    return 0;
}
저작자표시 (새창열림)

'BOJ > 백트래킹' 카테고리의 다른 글

14888번: 연산자 끼워넣기  (1) 2025.06.04
2580번: 스도쿠  (0) 2025.06.04
1799번: 비숍 (BOJ C/C++)  (0) 2022.09.08
18809번: Gaaaaaaaaaarden  (0) 2022.09.07
16987번: 계란으로 계란치기 (BOJ C/C++)  (0) 2022.09.06
    'BOJ/백트래킹' 카테고리의 다른 글
    • 14888번: 연산자 끼워넣기
    • 2580번: 스도쿠
    • 1799번: 비숍 (BOJ C/C++)
    • 18809번: Gaaaaaaaaaarden
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바