Problem : 소문난 칠공주
유형 : Backtracking
해결 전략
- 먼저 7명을 조합을 이용하여 뽑아본다.
- 총 25명으로 구성되어 있으니, 25명중 7명을 뽑는 경우의 수는
25 C 7
로 480699 이 나온다. - BFS를 이용하여 서로 연결되어있는지를 확인한다.
480699 x 25 < 2억
이므로 해결 가능하다.
주의할 점
- 일반적인 DFS, BFS 기법으로 풀리지 않는다.
- 십자가 모양이 있기 때문이다.
모든 조합의 경우를 따져볼 수 없다
- 십자가 모양이 있기 때문이다.
- 미리 조합을 만들어보고, 검증만 BFS로 하면된다.
풀이
칠공주 조합을 만들어본다.
- 25명이니 7명을 선택하고 permutation을 통해 480699가지의 조합을 만든다.
팀을 구성한 인원들을 체크한다.
- 조합에서
1
이 위치한 곳이 팀을 이루는 인원이 존재하는 곳이다. - 만약
n
이 3이고1
이 5에 있다면
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
- (1, 2)에 있음을 알 수 있다.
- 이것은 (
5/3
,5%3
)을 통해 구할 수 있다. - 과거 스도쿠 문제도 이렇게 풀었으면 좋았을껄..
- 이것은 (
- 각 좌표의 값을 BFS시 갈 수 있는곳으로 표시해둔다.
- 만약 임도연 파
Y
가 4이상이면, 칠공주 결성이 불가능하다.
팀원들이 전부 연결 되어있는지 확인한다.
- 팀구성원중 아무나 한명을 BFS 시작점으로 잡고 BFS를 해본다.
- 필자의 경우, 마지막으로 구성된 팀원을 시작점으로 삼았다.
- 만약 7명이 전부 연결되어 있다면, 칠공주 결성이 가능하다.
코드
2021-09-27 코드 수정
1 |
|
피드백
- 일반적인 BFS, DFS가 불가능함을 빨리 캐치했어야 했다.
- 모든 조합의 수를 만들어보고 해보는것도 하나의 솔루션이 될 수 있다.