whdvy3   2년 전

계속해서 시간초과가 나는데 혹시 이유를 알 수 있을까요?

wapas   2년 전

Swift가 느려서 시간 초과가 발생하는 것 같네요.

같은 로직으로 다른 빠른 언어(ex. c++)로 제출한다면 발생하지 않았을 것으로 보입니다.

제가 직접 제출해보니 프로그램이 좀 더 빠르게 수행할 수 있게 최적화를 잘해서 제출하면 약 1900ms 시간으로 "맞았습니다!"가 나옵니다.

그러나 아이디어 하나만 적용하면 1900ms에서 1300ms로 수행 시간을 단축 할 수 있습니다.

n이 음이 아닌 정수 일 때

x, y 좌표에 k번 벽을 파괴해서 도달했을 때 (x, y, k) 라고 합시다.

이미 이전에 (x, y, k - n)을 방문했다면 (x, y, k)를 볼 필요가 있을까요?

이 점을 이용하면 whdvy3님 Swift 코드로도 "맞았습니다!"가 나올 수 있습니다.

whdvy3   2년 전

벽을 더 많이 부수고 갔을 경우가 적게 부수고 갔을때 보다 값이 작다..라는 의미인가요?

이해를 잘 못하겠습니다..ㅠㅠ

wapas   2년 전

x, y 좌표에서 목표 지점 n, m으로 가는데 벽을 3번 부셔야 한다고 가정합시다.

0, 0 좌표에서 x, y 좌표까지 벽을 1번 부수고 도착한 적이 있다고 합시다.

그러면 0, 0 좌표에서 x, y 좌표까지 벽을 1번 부수고, x, y 좌표에서 n, m 좌표로 가는데 벽을 3번 부스고 도착하니, 0, 0에서 n, m으로 가는데 벽을 총 4번 부셔야 합니다. <--- 이 과정을 A라고 합시다.

BFS 도중에 똑같은 x, y 좌표에서 벽을 5번 부수고 도달했다고 합시다.

그러면 0, 0 좌표에서 x, y 좌표까지 벽을 5번 부수고, x, y 좌표에서 n, m 좌표로 가는데 벽을 3번 부스고 도착하니, 0, 0에서 n, m으로 가는데 벽을 총 8번 부셔야 합니다. <--- 이 과정을 B라고 합시다.

이렇게 본다면 B과정에서 'x, y -> n, m' 탐색은 전혀 보지 않아도 됩니다.

문제에서 구하는 것은 최단 거리고, 이미 이전에 A 과정이라는 최단 거리를 구했기 때문입니다.

정리하면 어떤 좌표에 방문했는데, 이미 이전에 벽을 적게 파괴해서 도달한 적이 있다면 "지금 현재 상태가 벽을 더 많이 파괴했으므로(= 벽을 파괴하여 더 많이 이동했으므로)" 지금 상태에서는 최단 거리가 될 수 없습니다.

wapas   2년 전


whdvy3   2년 전

무슨말씀이신지 이해를 하겠는데 제 수준에서는 코드로 도저히 구현이 불가능하네요..

나중에 다시시도해봐야겠습니다..

whdvy3   2년 전

인접한 네방향을 탐색하면서 이전에 벽이 하나 더 있을때 탐색한곳을 탐색하려하면 continue로 무시해줘서 위에서 말씀하신 상황인 B와 C상황을 안들어가게 해주었지만 시간초과가 났습니다.

잘못처리해준걸까요? 

wapas   2년 전

if visited[nx][ny][wall + 1]{continue} 에서, 처리를 못하는 케이스가 있는 것 같습니다.

예를 들어서 

x, y에 처음 방문 했을 당시 벽을 부순 횟수가 4라서 visited[x][y][4]를 true로 저장했다고 합시다.

x,y 두 번째로 방문했을 때는 벽을 부순 횟수가 1이라서 visited[x][y][1 + 1]은 false이므로 visited[x][y][4]를 true 해준 의미가 없어지게 됩니다.

whdvy3   2년 전

아직까지 도저히 모르겠는데,, 혹시 어느부분을 어떻게 고쳐야할지 알려주실수 있나요?

wapas   2년 전

풀이법은 다양하게 있을 것 같은데 제가 사용한 풀이법은 아래와 같습니다.

visited 배열을 3차원으로 두지 않고 2차원으로 둡니다. 대신 Bool 자료형을 담는게 아닌 Int 자료형을 담습니다.

그리고 visited 배열을 아래와 같이 정의를 했습니다. visited[y][x] 값을 k라고 할 때,

y, x 좌표에 방문했을 때, k가 -1이면 그 좌표는 한 번도 방문하지 않았음을 의미하는 것이고

k가 0이상 이면 그 좌표에 방문 했을 때, 벽을 k번 파괴하고 도달했다는 의미입니다.

예를들어 현재 y, x 좌표에서 벽을 5번 부셔서 도착 했는데, visited[y][x]가 1이면 그 정점은 더 이상 탐색할 필요가 없어집니다.

whdvy3   2년 전

드디어 해결했습니다 감사합니다 ㅠㅠ

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