티스토리 뷰

https://www.acmicpc.net/problem/16946

 

16946번: 벽 부수고 이동하기 4

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이

www.acmicpc.net

그냥 단순하게 bfs를 돌면 무조건 시간초과가 날 문제입니다. (100만 개 탐색을 100만번....)

 

그렇기 때문에 다음의 과정을 거쳤습니다.

 

1. 0으로 연결된 애들의 개수를 세준다. ex. 0 0 0 이런 맵이면 해당 위치는 연결된 0이 3개 이므로 3 3 3이 된다.

(그리고 이들은 모두 같은 영역이므로 2번 과정에서 카운트 시 중복되서는 안 됨)

2. 1 위치에서 상하좌우 돌면서 0이 나오면 그 위치의 값을 더한 값에 1을 더한 값 (자기 자신)이 답이다.

(단, 같은 영역의 0인 경우 또 더하면 안 된다.)

 

이러한 과정을 거치면 결국 0의 영역을 나누는 것은 최대 100만 번 탐색과 100만 번 값 복사, 1의 영역을 기준으로 탐색하는 것도 최대 100만번 이므로 초기 세팅을 비롯해도 100만번 x N 번 정도 연산이므로 시간초과에 여유롭습니다. (N은 문제에 주어진 N 아니고 그냥 적당한 값....) 

 

코드는 다음과 같습니다.

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 15486 퇴사 2 C++  (0) 2022.04.02
백준 3955 캔디 분배 C++  (0) 2022.03.29
백준 2668 숫자고르기 C++  (0) 2022.03.15
백준 1067 이동 C++  (0) 2022.03.05
백준 13277 큰 수 곱셈 C++  (1) 2022.03.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함