y_ht   3년 전

20 * 20 크기의 입력도 제대로 처리하는 것을 확인했습니다.

그런데 시간초과가 나옵니다.. 왜 그런지 이유를 모르겠어요

소스코드에 구현 내용에 관한 주석을 첨부했습니다.

하단에 TC로 적어둔 내용은 제대로 정답이 나오는지 확인한 테스트케이스 모음입니다.

julysky   3년 전

안녕하세요, 제가 해당 코드를 요리조리 조금씩 수정해서 제출해봤는데,

결론만 말하면

map<int, int> v ; 가 매우 느립니다.

이부분만 int v[256]; 으로 바꿔주셔도 아주 빨라져요.

map<int, int> 이 느린 이유는 map은 key 값을 이용해 value에 접근하는게 배열의 인덱스와 달리 O(log n) 이 걸리기 때문입니다. (배열의 인덱스를 이용한 접근은 O(1))

map<int, int> v 를 굳이 살리면서 통과하려면

dfs 함수내에서 코드를 조금 손 볼 필요가 있습니다. 예를들어서

if (v[board[r][c]] == 0) v[board[r][c]] = 1; 해당 부분은 맨 처음에만 true이고 그외엔 전부 false 이기 때문에 쓸데 없이 매번 조건비교를 하면서 시간낭비를 합니다.

이부분을 아예 dfs 밖으로 빼도 아슬아슬하게 통과하네요.

y_ht   3년 전

@julysky

자세한 설명 너무 감사합니다! 저는 map<int, int>가 처음 생성할때 O(logN)이고, 그 이후부터는 O(1)으로 접근한다고 잘못 알고있었네요... 그래서 set을 쓰다가 map으로 바꿔준건데 map도 O(logN)인건 처음 알았어요. 


if문도 수행시간에 거의 영향을 안끼칠거라 생각하고 작성한건데 다 시간을 잡아먹었군요.. 많이 배워갑니다 감사합니다!

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