morning   5년 전

[하소연]

저는 BFS를 이용한 완전탐색의 방법으로 문제를 풀었습니다.

첫 번째 돌리고는 런타임에러가 났습니다.

배열 큐를 사용했는데 크기 계산할 때 단순히 50 * 50 이기에 대충 3333을 잡았습니다만,


곰곰히 생각해보니 같은 칸이어도 더 적은 수의 검은방을 거쳤을 경우 또 들어가기 때문에 3333은 부족한 크기구나 라는걸 깨달았습니다.


무작정 크기를 키우고 두 번째 돌렸더니 틀렸습니다를 받았습니다.


코드를 보다보니 부순 벽의 최솟값을 구하는데 끝점에 가장 빨리 도착한 순간 정답을 외치니 도착은 늦었지만 더 좋은 과정을 거쳐온 친구들이 섭섭해했겠구나 생각이 들었습니다.


세 번째는 맞았습니다.


맞기 전까지는 틀렸다는 사실에 당황해 생각해볼겨를 없이 되는대로 넣어 맞았지만, 맞고 나니 여유가 생겼습니다.

[본문]

50 * 50 크기의 배열이지만 지금까지 방문한 검은 방의 수가 적은지 여부에 따라 큐에 또 들어갈 수도있고 안들어갈 수도 있는데

이런 경우엔 최대 공간복잡도를 어떻게 계산할 수 있을까요?

미천한 하수에게 가르침을 부탁드립니다.

chogahui05   5년 전

state는 3개인가요? x좌표, y좌표, 검은 녀석을 흰 녀석으로 바꾼 횟수.

그런데, 잘 봅시다. 검은 녀석을 흰 녀석으로 바꾼 횟수 >= n+m이고

n+m회 바꾸면 시작점에서 끝점까지 갈 수 있음이 보장됩니다. 만약에 visit[black_to_white][x][y] 이렇게 두었다면..

시간 복잡도는 (n+m)*n*m이 되겠네요.

Question

그러면, 더 좋은 방법이 없을까요? 

Hint. 검은 녀석에 들어왔을 때, cost가 1이고, 흰 녀석에 들어갔을 때 cost를 0으로 set 하면 어떨까요?

morning   5년 전

먼저, 답이 늦어 죄송합니다.. ㅠ 메리 크리스마스~^^ (보내세요)

으흠, 그렇군요. 어차피 n+n만큼 뒤집으면 최악의 경우의 최솟값이군요.

그래서 visit 배열을 visit[n+n][n][n]으로 놓는다고하면

공간 복잡도는 2 * n^3인거고... 음, 시간 복잡도도 2 * n^3 인거군요? (맞나요?)

n 최대가 50이니께 0.25 백만 번이면, 1초 충분하네요

Answer Try

음, 힌트를 먼저 읽으면

맵을 2차원 배열에 입력 받을 때 검은 방이면 1로 놓고 흰방이면 0으로 놓는다는 걸까요?

그러면 방문할 때 맵의 방문하는 칸 값을

이 번에 큐에서 뺀 친구의 방문값(지금까지 바꾼 방의 수)에 그대로 더해서

다시 큐에 넣어 줄 수 있을 것 같습니다.

조건문 써서 검은 칸인지 흰 칸인지 비교를 안해도 되니까

작성하기도 더 편하고 더 빨라질 것 같습니다 (이게 맞나여?)

이상, 하수 올림

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