
고작 실버2 문제에 이렇게 스트레스를 받을 이유가 없는데 왜 안되나 계속 돌려도 테스트 케이스들은 다 맞았다.
팀원들을 넣는 경우의 수를 dfs로 돌려야 한다.
그러면 팀원들을 짜는 조합인데 중복이면 안된다. (1, 1, 1)이 들어가면 안됨
그래서 dfs 내 반복하기 위한 (visited를 1로 만들어 1번 팀으로 만들기 위한)
for 문이 중요한데
굳이 반복하지 않아도 되는 인덱스는 넣지 않도록 설계하는것이 중요하다.
처음에 이것때문에 시간초과가 몇번 나서 백준의 시간 기준이 참 미워졌었다.
cmath의 절대값을 구해주는 abs 함수를 사용하는것도 도움이 된다.
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
int n;
int arr[21][21] = {0, };
int Min = 999999999;
int team1[10];
int team2[10];
vector<int> t1;
vector<int> t2;
int team1sum = 0;
int team2sum = 0;
int visited[21] = { 0, };
void dfs(int cnt, int pos)
{
if (cnt == n/2)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i != j && visited[i] == 1 && visited[j] == 1)
{
team1sum += arr[i][j];
}
if (i != j && visited[i] == 0 && visited[j] == 0)
{
team2sum += arr[i][j];
}
}
}
if (Min > abs(team1sum - team2sum))
{
Min = abs(team1sum - team2sum);
}
return;
}
for (int i = pos; i < n; i++)
{
if (!visited[i])
{
visited[i] = 1;
dfs(cnt + 1, i+1);
visited[i] = 0;
team1sum = 0;
team2sum = 0;
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
dfs(0, 0);
cout << Min;
return 0;
}
틀린 기록을 보면 중간부터 13~14% 에서 계속 '틀렸습니다' 가 떴다.
억울해서 정신 나갈뻔 했는데 한 20분 동안 찾아보다 N이 20까지 가능했었는데 visited 배열만 10으로 설정이 되어 있었다 🤬🤬🤬
일단 기본 조건을 확실하게 생각하지 않아서 생긴 참사이기 때문에 앞으로 잘 확인하도록 해야겠다. 코테에서 이렇게 떨어지면 너무 억울하지 않을까...
그리고 감기걸린거 같아서, 아니 감기 걸려서 머리가 좀 뜨겁고 어질어질하고 기침이 나오는데 visited 배열이 머리를 더 따뜻하게 해주니 푹 잘 수 있을 것 같다...