[문제]
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo
[풀이]
1) 시뮬레이션 문제 (완탐 필요)
2) 구슬은 총 n번 떨어뜨릴 수 있기 때문에 DFS cnt == n이면 종료하고 지금 남아있는 벽돌의 개수를 센다.
3) 이 문제에서 중요한 점은 Map을 유지하는 데 있다. 맵을 전역변수로 빼지 않고 계속 변수로 넘겨주면서 보존을 해야한다.
4) 구슬을 떨어뜨리는 dfs는 재귀호출을 하면서 가장 위의 벽돌에 구슬을 떨어뜨린다.
- 만약 지금 제일 위의 벽돌이 1이라면 자기 자신만 폭파(?) 되고 끝난다. (이번 row는 끝났으므로 break)
- 1이 아니라면 연쇄 폭파되어야 하므로 bomb라는 함수를 호출한다.
- bomb는 현재 좌표, 현재 맵정보를 넘겨준다.
5) bomb에서는 일단 현재 좌표의 벽돌을 제거해주고 cnt(연쇄로 떨어뜨려야 하는 값)만큼 상하좌우로 탐색하면서 1이라면 0으로 만들어주고 아니라면 또 연쇄로 폭파시켜야 하기 때문에 큐에 넣는다.
6) 상하좌우 탐색이 끝나면 연쇄로 폭파되어야 하는 것들만 visited처리가 되어있을 것이다.
그럼 다시 재귀로 호출해서 또 연쇄로 폭파한다. -> 현재 값을 계속 폭파하지 않도록 visited 현재 좌표는 false로 만들어준다.
7) 폭파가 끝나면 다시 dfs의 호출시점으로 되돌아올 텐데 역시 가장 윗 벽돌에 구슬을 떨어뜨렸기 때문에 이번 라인은 끝난다. break처리
8) 구슬을 떨어뜨린 한 라인의 폭발이 끝나면relocateMap()을 호출해서 벽돌을 밑으로 끌어내린다.
9) 다시 dfs(cnt+1)을 호출해서 구슬을 떨어뜨린다.
10) cnt==n이라면 벽돌의 최소값을 비교한다.
'SWEA > 삼성SW역량테스트 C++' 카테고리의 다른 글
[SW Test 샘플문제] 프로세서 연결하기 (0) | 2020.04.15 |
---|---|
[SWEA] 보물상자 비밀번호 (0) | 2020.04.14 |
[SWEA] 원자소멸시뮬레이션 (0) | 2019.10.07 |
[SWEA] 점심식사시간 (0) | 2019.09.11 |
[SWEA] 활주로 건설 (0) | 2019.08.02 |