roigh12   5년 전

이제 코딩공부 막 시작한 늅늅이입니다.

숨바꼭질 3 풀다가 뭐가 틀렸는지 모르겠어서 글올립니다.

고수님들 한번씩 봐주세요.ㅠㅠ

우선순위 큐를 활용해서 순간이동하는 경우를 먼저

다 탐색해주고 해보았는데 계속 틀렸다고 뜨네요

hello70825   5년 전

현재 bfs함수가 cnt 숫자가 작은 순부터 움직이지 않고, cur 숫자가 작은 순부터 움직이고 있습니다.

(13번째 줄에 print(cur,cnt)를 추가하시고, 예제를 입력한다음 좌표가 9일 때 cnt를 보세요. 원래 9일 때 1이 나와야합니다)

질문자님 의도대로 만들려면 다른 리스트 Q를 만들어서 (좌표*2)는 q에 저장하고, (좌표+1),(좌표-1)은 Q에 저장한 후에 q가 비어있을 때, Eq에 있는 값을 q로 가져오고 Eq의 리스트는 다시 비우는 식으로 하면 됩니다.

q=[x,y,z]   Q=[a,b]

q=[]    Q=[a,b,c,d]

q=[a,b,c,d]   Q=[]

이런식으로요

hello70825   5년 전

리스트 한 개로만 만들고 싶으시면 deque를 사용해서 (좌표*2)는 appendleft를 이용해 큐의 맨 앞에 추가하시고, (좌표+1) (좌표-1)은 append를 이용해 리스트의 맨 뒤에 추가하면 됩니다.

roigh12   5년 전

hello님 말대로 좌표*2 를 appendleft를 사용했으니 맞았습니다. 그런데 아직도 잘 이해가 되질 않아요. 왜 2배로 순간이동한거는 큐의 맨 앞부분에 넣어주는거죠?? ㅠㅠ

roigh12   5년 전

그리고 블로그에서 솔루션을 봤을 떄 우선순위 큐를 사용해야 한다고 들었는데 저렇게 appendleft를 사용하면 우선순위 큐 말고 일반 deque로 사용해도 되는건가요??

hello70825   5년 전

문제에서 최소 값을 구해야 하니까 이동하는데 0초 걸리는 순간 이동을 큐의 맨 앞에 넣어서 먼저 처리하도록 만든 것 입니다.

그리고 숨바꼭질3 우선 순위 큐라고 검색해보니까 블로그가 두 개 나오던데 제가 c언어를 잘 모르겠지만, 블로그에 적힌 내용을 보면 둘 다 경과 시간을 기준으로 시간이 적게 걸린 곳이 더 높은 우선 순위를 가지게 되어 먼저 계산한다고 되어있습니다. 제가 appendleft를 하는 이유도 같은 이유 입니다.

근데 roigh 님의 코드는 q가 경과 시간을 기준으로 작동하는게 아니고, 좌표가 작은 순서대로 q가 작동하여 생각하지 못하는 결과가 나올 수가 있는 것이죠

heapq를 이용해 다시 만드신다면 10줄에 start랑 0의 순서를 바꾸고, 거기에 맞게 다른 부분도 수정해서 제출하면 아마 통과가 될겁니다.

roigh12   5년 전

아아 매번 도움 감사합니다!!

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