Problem : Gaaaaaaaaaarden
유형 : 조합, 구현, 완전 탐색
해결 전략
- 주어진 모든 배양액을 남김없이 사용해야 한다 이 조건을 캐치해야 한다.
조합
- 배양액을 뿌릴 수 있는 땅을 1차적으로 선별하고
permutation
을 이용하여, 배양액을 놓을 수 있는 땅의 모든 조합을 만든다. - 비슷한 방법으로 푼 문제 : 소문난 칠공주
- 배양액을 심는 좌표들을 시작점으로 삼고
BFS
를 진행 시킨다.BFS 시작점은 여러개가 될 수 있다
주의할 점
- 배양액마다 따로 BFS를 진행시켜선 안된다.
- 나의 경우 처음 접근할때, 배양액 별로 따로 진행시키고 접근 시간의 교집합을 이용했다. * 이 방법은 반례가 존재한다.
반례
1 |
|
{1, 1}
지점에 꽃이 피어서{1, 2}
지점에는 꽃이 피어선 안되지만G
를 먼저 BFS를 진행시킨뒤,R
을 BFS를 진행시킨다면{1, 2}
지점에도 꽃이 피게 된다.
풀이
배양액을 심을 수 있는 땅의 좌표를 저장한다
- 배양액을 심을 수 있는 조합을 이용할때 사용한다.
배양액을 심는 모든 조합을 만들어본다.
- 초록색 배양액의 경우
4
- 빨간색 배양액의 경우
3
- 배양액을 심을 수 있는 좌표가 더 남아있다면
0
으로 채워준다.
만약 초록 배양액이 2개, 빨간색 배양액이 3개, 배양액을 심을수 있는 좌표가 7개라면
4433300
이 될것이다.permutation
을 이용하여 모든 조합을 만들어본다.
BFS를 진행한다.
- 심어진 배양액의 타입을 기록하며,
BFS
를 진행한다. - 주위에 호수가 아니고, 배양액이 퍼져 나갈 수 있는 곳이라면
- 해당 좌표에
방문한 시간
과자신의 타입
을 기록하며 진행한다.
- 해당 좌표에
- 방문하려는곳에 다른 타입의 배양액이 뿌려져 있다면
- 같은 시간에 방문하는 경우라면 꽃을 피운다.
코드
1 |
|
피드백
- 두개 이상의 좌표에서 BFS를 진행하는 문제를 주의하자.
- 맨 처음 배양액을 뿌릴때, 좌표에 타입 표시를 안해두고 BFS를 진행하여 답이 이상하게 나왔었다.