티스토리 뷰
반응형
#. Problem
* The copyright in this matter is in BOJ
#. Resolution Process
1. Read and understand problem
2. Redefine the problem + abstract
3. Create solution plan (select Algorithm, Data structure)
4. Prove the plan (check performance time and usage memory)
5. Carry out the plan
6. Look back on the plan and find a way to improve it
#. Solve
총 N명 중에 N/2명으로 이루어진 두 팀을 만들어야 한다.
먼저 스타트팀에 속할 사람 N/2명을 조합으로 선택하게 된다면
나머지 N/2명은 링크팀에 속하게 된다.
두 팀의 팀원이 모두 정해졌다면,
각 팀의 능력치 차이가 최소인 경우를 찾으면 된다.
#. Code
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 54 55 56 57 58 59 60 61 62 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ14889 { static int T, N, res = Integer.MAX_VALUE, ability[][], sum[]; static boolean isSTeam[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; N = Integer.parseInt(br.readLine()); ability = new int[N][N]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { ability[i][j] = Integer.parseInt(st.nextToken()); } } isSTeam = new boolean[N]; setTeam(0, 0); System.out.println(res); } private static void setTeam(int idx, int cnt) { // 나올 수 있는 최소값이 이미 나왔으면 더이상의 조합을 확인할 필요가 없음 if (res == 0) return; // 모든 직원을 다 확인했는데, 스타트팀이 만들어지지 않았다면 if (idx == N) return; // 스타트팀이 N/2명의 팀원을 모두 선택했다면 나머지는 링크팀 if (cnt == N / 2) { int STeam = 0, LTeam = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { // 두 직원 모두 스타트 팀이라면 능력치 누적 if (isSTeam[i] && isSTeam[j]) STeam += ability[i][j]; // 링크팀 소속일 경우 if (!isSTeam[i] && !isSTeam[j]) LTeam += ability[i][j]; } } res = Math.min(res, Math.abs(STeam - LTeam)); return; } // 이 직원을 스타트팀으로 선택해보자. isSTeam[idx] = true; setTeam(idx + 1, cnt + 1); // 그냥 선택 안 할래. isSTeam[idx] = false; setTeam(idx + 1, cnt); } } | cs |
반응형
'PS > Problem_Solving' 카테고리의 다른 글
[BOJ] 7562. 나이트의 이동(BFS).java (0) | 2020.08.28 |
---|---|
[SWEA] 3234. 준환이의 양팔저울(순열,부분집합).java (0) | 2020.08.28 |
[BOJ] 1987.알파벳(DFS,백트래킹).java (2) | 2020.08.27 |
[BOJ] 3109.빵집(DFS,백트래킹,그리디).java (0) | 2020.08.27 |
[BOJ] 1194.달이 차오른다, 가자(BFS, BitMask).java (0) | 2020.08.26 |
댓글