본문 바로가기

SWEA/삼성SW역량테스트 C++

[SWEA] 벽돌깨기

[문제]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

[풀이]

 

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