# 백준 : 스타트와 링크 (14889)
문제
https://www.acmicpc.net/problem/14889소스
(Github: https://github.com/wonjnlee/wallydev/blob/master/bj_14889_startandlink)#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <cmath>
using namespace std;
int N;
int map[21][21];
int team[21];
long long int result = 100000000000;
long long int cal() {
long long int team1_val = 0;
long long int team2_val = 0;
vector <int> team1;
vector <int> team2;
for(int i=0; i<N; i++) {
if(team[i] == 1) team1.push_back(i);
else team2.push_back(i);
}
for(int i=0; i<team1.size()-1; i++) {
for(int j=i+1; j<team1.size(); j++) {
team1_val += (map[team1[i]][team1[j]] + map[team1[j]][team1[i]]);
team2_val += (map[team2[i]][team2[j]] + map[team2[j]][team2[i]]);
}
}
return abs(team2_val - team1_val);
}
void DFS(int index, int cnt) {
if(index >= N) return;
if(cnt >= N/2) {
result = min(result, cal());
return;
}
DFS(index + 1, cnt);
team[index] = 1;
DFS(index + 1, cnt + 1);
team[index] = 0;
//DFS(index + 1, cnt);
}
int main(void)
{
cin>>N;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) cin>>map[i][j];
}
DFS(0,0);
cout<<result<<endl;
return 0;
}
풀이
아이디어는 명확하게 세워놓았는데, 사소한 오류 때문에 시간을 많이 잡아먹었다.백트래킹을 이용했고, 각각의 경우에 대해 벡터를 만들어놓고 해당 벡터 값을 모두 계산하였다.
어차피 순서대로 1,2,3,4가 있을 때
1,2 / 1,3 / 1,4 / 2,3 / 2,4 / 3,4 만 구하면 되므로 여기에 대한 벡터를 다 더해주면 된다.
(사실 윗 부분을 잘못 구현해서 오류가 계속 발생했었다... 샘플은 다 맞던데 왜 그랬을까)
댓글
댓글 쓰기