blackbbean   5년 전

9328번 알고리즘 로직 질문드립니다. 

대부분의 블로그 문제 풀이가, 

탐색을하면서 문을 열고, 문을 열수 없다면 문 큐에 넣고, 열수 없었던 문의 열쇠를 찾으면 

해당 문으로 이동하여, 탐색을 진행하는 로직으로 짜여있는걸 확인하였습니다. 

하지만 , 저같은 경우는 문제 풀이를 할 때, 조금 다른 방향으로 접근 하였습니다. 

visited 행렬을 따로 두고, visited 행렬에 보유한 key의 갯수값을 저장함으로써 

방문 했음 여부를 나타내었고 

이 문제의 주된 특징인 과거에 방문하였던 지점을 다시 방문해야할 경우를 

이전에 방문했을 때보다 현재 방문할경우의 key의 갯수가 클때라 생각하여  (visited 값이 이전보다 클 경우)

이전에 방문했을 때보다 현재 방문할 경우의 key의 갯수가 클때만 해당 지점을 다시 방문할 수 있도록 하였습니다. 

제 개인적인 생각으로는 전혀 문제될 것이 없는 로직인데 계속 '틀렸습니다'가 뜨는 이유를 잘 모르겠습니다 ㅠㅠ 

실제 대회의 testcase를 돌려봤을 때, 대부분 정답 처리가 되었지만 몇몇 케이스의 경우가 정답보다 작은 값을 출력하는 경우가 존재하였습니다. 

맵의 크기도 큰 편이라 디버깅 할 엄두도 안나네요 ㅠㅠ 

유사한 문제라 생각하는 

1194번 '달이 차오른다 가자' https://www.acmicpc.net/proble...

역시 이런 방식으로 풀었고 역시 오답 처리가 되어서 왜 이 풀이가 되지 않는지 궁금해졌습니다.

그럼 답변 기다리겠습니다 !! 

doju   5년 전

반례 찾느라 재밌었습니다 :D 아래 데이터의 경우 b 열쇠를 얻은 직후에는 A 문을 열 수 없고, a 열쇠를 얻은 뒤에는 A 문을 열러 갈 수 없습니다.

blackbbean   5년 전

감사합니다 ㅠㅠ 생각치도 못한 케이스네요 ... 

dlaud5379   4년 전

1년이 넘은 글이긴 하지만 위의 반례는 a 열쇠를 얻고 나가서 다른 입구로 들어갈 수 있으니 답이 0이 아니라 1이 되어야 할 것 같습니다.

imn00133   4년 전

@dlaud5379

맨 아래 0은 key가 주어지지 않았다는 뜻입니다.

답은 1 맞습니다.

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