wony6731   5년 전

항상 시간복잡도를 생각하고 풀지 않다가 시간초과가 뜨니깐 막막하네요 ㅜㅜ

혹시 시간복잡도를 따진다면 input을 보고 이 문제는 어느 정도의 시간복잡도가 허용되어야 하니깐

어떠한 알고리즘을 써야겠다 라는 식의 사고가 진행되는건가요??

저는 시간복잡도 생각안하고 구현만 생각해서 시간복잡도 생각하며 푸는 사고의 흐름이 궁금하네요 ㅜㅜ

그리고 해당 코드에서 어떤 부분이 시간 초과가 나는지 알 수 있을까요???

대략적인 흐름은 이렇습니다.

  1. 상근이의 첫 시작 위치를 큐에 삽입합니다.
  2. boardUpdate()를 이용하여 1초 지난 불의 번짐을 적용합니다.
  3. 상근이의 이동을 적용합니다.
  4. 2~3번을 반복합니다.(여기서 주의할 점이, 1초 지나고 나면 상근이의 움직임에 따라 큐에 1~4개가 삽입됩니다. 하지만 모두 2번이 그대로 적용되면 큐에 삽입되어 있는 상근이는 1초가 지난 상근이지만 불의 상태는 2초, 3초, 4초가 지난 상태로 계속 번지게 됩니다. 이 부분을 코드에서 93번째 줄 "flag 변수"를 통해 조절하였습니다.)
  5. 마지막 노드의 상태를 보고 time 또는 "IMPOSSIBLE"을 출력합니다.

혹시 어디에서 시간초과가 발생하는지, 어떠한 사고방식으로 시간복잡도를 생각하며 접근하는지를 알 수 있을까요???? ㅜㅜ


newdeal   5년 전

안녕하세요.

우선 이 코드의 시간초과가 난 원인은 boardUpdate() 함수 때문인 것 같습니다.

N과M은 각각 최대 1000인데, 최악의 경우 매초마다 N*M만큼의 시간을 계속 소모하게됩니다.

하지만, 불의 시작점의 좌표를 bfs돌리면 각좌표마다 어느시간부터 불이붙어있는지 알수있습니다.

예를들어,

*..

...

의 맵이있으면,

012

123

즉, (1,2)의점은 1초후부터는 불이붙어있고, (2,3)의점은 3초후부터는 불이붙어있다 라는 정보를 매초마다 맵을 업데이트하지않아도 한번의 bfs로 알수 있게됩니다.

이 방식을 코드에 적용시키시면 문제를 풀수있을거같습니다.

그리고 시간복잡도 관련해서 말씀드리자면, 저는 아직 너무나도 부족하지만 제경험상으로는

최대한 for문을 어떻게하면 줄일수있을까? 부터시작했던것 같습니다. 좀더 나아가면 내가 찾았던 정보를 앞으로 어떻게 활용할지?

그리고 자료구조 쪽으로 넘어가면 원소삭제나 원소찾기가 빈번해지면 vector를 버린다던지..

그리고 아직 미숙하지만 조금의 빅오계산법도 천천히 익숙해지고 있는데, 역시 문제많이 푸는게 최고인것같습니다.

답변이 만족스러웠을지 모르겠지만, 작성자님의 공부에 최대한 도움이 되었으면 좋겠네요..🙏

참, 그리고 이문제 AC받으시면 4179번문제와 3055번문제가 비슷한 메커니즘을 가지고 있습니다. 이문제도 푸시면 좋으실것 같네요.

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