park780172   5년 전

계속 시간 초과를 어떻게하면 더 줄일까에 대해 고민을 해봐도
마땅한 방법이 떠오르지 않아 질문 해봅니다.

제가 의도한 문제 풀이는

우선 2중 for문으로 (0, 0)에서 출발하여 Map[행][열]의 값이 0인 곳을 찾은 후
이 값을 1로 바꿔주고 DFS(행, 열) 탐색합니다. 그리고 다시 Map[행][열]의 값을 0으로 원상복구시킵니다.

그리고 ans = max(ans, cnt);를 통해 ans의 값을 갱신 시켜줍니다.

어차피 무조건 단 한 곳만 바꿔서 그 바꾼 곳을 기준으로 최대 크기를 구하는 것이므로,

복잡하게 구현할 필요가 없다고 느꼈습니다.

예제들은 다 맞게 뜹니다.

배열 크기가 최대 1000 * 1000라서 직접 1000 * 1000 배열 시간 초과에 해당하는

반례를 못 찾겠습니다.

그래서, 제 코드에서 어떻게하면 시간 더 줄일 수 있는 방법이 있는지 궁금하여

질문해봅니다.

p_0   5년 전

다음과 같은 입력이 시간초과를 일으키는 듯 보입니다.

input : 

1000 1000

0 0 0 0 ... ... 0 0 0 0

0 0 0 0 ... ... 0 0 0 0

.                        .

.                        .

.                        .

0 0 0 0 ... ... 0 0 0 0

output : 1

0이 많은 입력의 경우 memset을 그만큼 많이 해주다 보니 시간초과가 나는것 같습니다.

psi0613   5년 전

맵 사이즈가 최대 1000*1000이라서 모든 지점을 한 번씩 1로 바꾸면서 그 때마다 DFS를 돌리면 시간초과가 나는게 맞는 거 같아요

저는 전체적으로 한 번 서치해서 각 영역을 찾아 놓고 그 후에 각 점에 대해서 4방을 보면서 이웃한 부분에 영역이 있는지 체크하면서 진행했네요

이게 말인지 뭔진 모르겠는데 도움이 되셨으면 좋겠네요ㅠ

park780172   5년 전

@p_0
@psi0613

두 분 모두 감사합니다.

memset이 의외로 시간이 걸리는가 보군요.

엄청 빠른 줄 알았는데..

생각해보니 미리 DFS로 그룹화 시켜서 이것을 저장시켜 활용하는 것이 더 빠를 수 있을 것 같아서

구현하여 제출하였더니 맞았습니다.

댓글을 작성하려면 로그인해야 합니다.