https://www.acmicpc.net/problem/1017
소수 체크와 이분매칭을 합쳐놓은 문제입니다.
우선 각 리스트의 요소에서 더하면 소수가 되는 목록을 만들어 노드간의 연결을 구해줍니다.
그 뒤 이분매칭을 해주면 됩니다.
전체에서 전체로 이분매칭을 하는 것이 왜 문제의 해답이 되는가 라고 생각할 수 있습니다.
문제에서 제시된 첫 번째 예시를 예로 들겠습니다.
connected_with_first : 첫 번째 수가 연결된 수 / connected : 선택된 수가 연결되어있는 인덱스
connected_with_first : 4 / connected : [3, 0, 1, 2, 5, 4]
connected_with_first : 10 / connected : [3, 2, 1, 0, 5, 4]
connected_with_first : 12 / connected : [3, 2, 1, -1, 5, 0]
전체에서 전체로 이분매칭을 돌릴 경우 이와 같이 결과가 나오는데,
1 -> 10
4 -> 1
7 -> 4
10 -> 7
11 -> 12
12 -> 11
첫 번째 수가 10 과 연결된 경우 / 첫 번째 수가 4 와 연결된 경우
1 -> 10
4 -> 7
7 -> 4
10 -> 1
11 -> 12
12 -> 11
두 경우 모두 첫 번째 수가 10과 연결된 경우로 같은 경우입니다.
모든 수가 매칭될 수 있을 경우, 어떤 수와 매칭된 수를 제거하는 과정을 거쳐도 남은 수들이 모두 매칭되므로 어차피 원하는 경우도 모두 매칭되게 됩니다. 그러므로 매칭되는 경우의 수를 구하는 경우 해당 방법으로 풀면 별도의 과정을 거쳐야 하지만 단순히 첫 번째 수와 연결되는 수를 찾을 때는 고르는 수 / 골라지는 수를 나누지 않아도 풀 수 있습니다.
다만 합이 소수라는 점에서 두 리스트를 홀수 / 짝수로 나누어 이분매칭을 할 수도 있습니다.
짝수인 소수는 2 밖에 없는데 2는 1+1 밖에 없기 때문에 중복되는 수가 없는 조건에서 존재할 수 없습니다.
즉 (홀수 + 홀수) 와 (짝수 + 짝수)는 고려의 대상이 되지 않기 때문에 위와 같이 나눌 수 있습니다. 또 이 방법이 좀 더 정석적인 풀이라고 볼 수 있겠습니다.
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 11377 <열혈강호 3> Python (1) | 2024.10.06 |
---|---|
백준 1671 <상어의 저녁식사> Python (2) | 2024.10.04 |
백준 9576 <책 나눠주기> Python (2) | 2024.10.02 |
백준 11375 <열혈강호 1> / 백준 11376 <열혈강호 2> Python (0) | 2024.09.30 |
백준 2188 <축사 배정> Python (0) | 2024.09.29 |