728x90
문제
https://www.acmicpc.net/problem/14889
알고리즘 풀이
1. 이차원 배열에 값을 입력받는다.
2. ck라는 boolean배열을 하나 만들어서 숫자를 뽑는 것을 체크한다.
3. 전체탐색을 해주면서 카운트를 1씩 올려준다.
4. 만약 카운트가 N의 절반이되면 팀이 반반으로 나뉜것이기 때문에 능력치를 비교해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; int N,Min = 987654321; int ary[21][21]; bool ck[21] = {false}; void dfs(int cur,int cnt){ if(cnt == N/2){ int result2 = 0,result1 = 0; vector<int> start; vector<int> link; for(int i = 0;i<N;i++){ if(ck[i]){start.push_back(i);} else{link.push_back(i);} } for(int i = 0;i<start.size();i++){ for(int j = 0;j<start.size();j++){ if(i != j){ result1 = result1+ary[start[i]][start[j]]; result2 = result2+ary[link[i]][link[j]]; } } } int result = result1-result2; if(result<0){result = result*-1;} Min = min(result,Min); return; } else{ for(int i = cur+1;i<N;i++){ if(ck[i] == false){ ck[i] = true; dfs(i,cnt+1); ck[i] = false; } } } } int main(int argc, char* argv[]){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N; for(int i = 0;i<N;i++){ for(int j = 0;j<N;j++){ cin >> ary[i][j]; } } dfs(0,0); cout << Min; } | cs |
728x90
'삼성sw역량테스트 기출문제' 카테고리의 다른 글
[Code Ground][SCPC 1차예선 방속의 거울] (0) | 2021.07.18 |
---|---|
[Code Ground][SCPC 예선 - 개구리 뛰기] (2) | 2021.07.17 |
미세먼지 안녕!(백준 17144번) (0) | 2021.05.25 |
치킨 배달(백준 15686번) (0) | 2021.05.24 |
컨베이어 벨트 위의 로봇(백준 20055번) (0) | 2021.05.23 |