dongdong119   1년 전

33%, 66% 대에서 '틀렸습니다' 뜨시는 분들, 특히 파이썬쓰시는 분들께 도움이 될 것 같아 글 남깁니다.

파이썬이라 알아보기 힘드실 분들을 위해서 간단히 풀이 소개해드리면

1. 방문을 체크하는 visited 배열(리스트)를 만듦(크기 1_000_001)

2. 처음 출발하는 층(S)을 큐에 넣고 그 층에 방문체크합니다.(출발하는 층이니 1을 넣음. 0이 아닌 이유는 밑에서 소개)

3.  큐가 빌 때까지 다음의 작업을 반복합니다.

  1) 큐에서 요소하나를 꺼냅니다.(v라고 함) 

  2) v에서 u층만큼 올라간 곳, d층만큼 내려간 곳이 건물 안에 있는지(즉, 0보다 크고 f보다 작거나 같은지) 확인하고, visited를    이용해 아직 방문하지 않은 곳인 것을 확인하면 (v에서 움직였으므로) 해당 층을 visited[v]보다 1크게 방문 체크하고, 다시 큐    에 넣습니다. 

4. 만약 출발 지점과 목표지점이 같으면 움직일 필요가 없으므로 0 출력합니다.

5. 출발지점과 목표지점이 다르다는 전제하에, visited[g]가 0이라면, g층을 갈 수 없다는 뜻이므로 "use the stairs'를 출력하고,    visited[g]가 0이 아니라면 visited[g]-1을 출력합니다. 

제가 코드를 잘못 작성해 수정한 부분은 총 3군데 입니다. 

1) v층에서 u/d만큼 오르고 내릴 때 건물 안에 있는 층인지를 확인하는 부분에서 0 < i (v + u / v - d) <= f라고 작성해야할 걸       0 <= i <= f이라고 작성했습니다.

2) 출발층(s)과 도착층(g)이 같은 경우를 고려하지 않았습니다. 처음에 출력부분에서 visited[g]가 0이면 "use the stairs'를 출력하고, 0이 아니면 visited[g]를 출력하도록 했는데, s=g이면 visited[g]는 0이므로 "use the stairs"를 잘못 출력하게 되는 것이죠.

3) while queue: 다음에 큐에 s를 넣고 visited[s] = 1로 설정해주는 코드를 추가했는데요, 이렇게 한 이유는 제가 아직 반례는 찾아내지 못했지만 아마 0으로 설정하고 코드를 돌리면 어떤 경우에서 visited[s]를 추후에 탐색할 때 아직 방문되지 않은 곳으로 생각해 잘못된 답을 계산하게 하기 때문으로 추측됩니다. 따라서 초기에 1로 출발 지점(visited[s])을 설정하고, 마지막에 출력할 때 -1을 해주는 방법을 채택했습니다.

풀이법 찾으시는 분들께 조금이나마 도움이 되었으면 좋겠습니다.

sonjungwoo9   1년 전

3) while queue: 다음에 큐에 s를 넣고 visited[s] = 1로 설정해주는 코드를 추가했는데요, 이렇게 한 이유는 제가 아직 반례는 찾아내지 못했지만 아마 0으로 설정하고 코드를 돌리면 어떤 경우에서 visited[s]를 추후에 탐색할 때 아직 방문되지 않은 곳으로 생각해 잘못된 답을 계산하게 하기 때문으로 추측됩니다. 따라서 초기에 1로 출발 지점(visited[s])을 설정하고, 마지막에 출력할 때 -1을 해주는 방법을 채택했습니다.

반례 ) 1000000 1000000 1 0 1

dongdong119   1년 전

반례 감사합니다. :)

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