mozzi01331   4년 전

안녕하세요, 인터넷에서 찾을 수 있는 풀이들과 대조해 봤는데도 왜 틀렸는지를 찾기 어려워서 여기에 질문글을 올립니다ㅠ.ㅠ

푸는 로직은 아래와 같습니다.

  1. n개만큼 숫자 입력을 받고, 첫번째 입력과 같은 성질(짝/홀수)는 A, 다른 성질은 B로 모읍니다.
  2. A와 B의 합 중 소수인 경우는 간선을 이어줍니다( canAdd[aIdx] = bIdx)
  3. 이후 첫번째 수(당연히 A[0]이 될)에 이어진 간선의 수만큼 이분탐색을 수행합니다.
    1. aMatch[0]은 해당 간선의 idx(i)로 초기화합니다
    2. bMatch[i]도 0으로 초기화합니다.
    3. 0번을 제외한 나머지 A간선의 개수만큼 dfs를 돌리고, return값을 result 변수에 업데이트합니다.
    4. result값이 n/2일 경우, pq에 넣습니다.


제가 놓친 부분 혹은 구현하지 못한 부분이 있는 것 같은데 뭔지 모르겠습니다ㅠㅠ... 감사합니다!

mozzi01331   4년 전

셀프로 해결했습니다ㅠ.ㅠ 임의의 반례 

8

1 2 3 4 5 6 7 8 을 했더니 답인 2 4 6이 나오지 않더라구요..

틀린 원인은... dfs에서의 초기에 탐색을 멈추는 조건이었습니다. 

0번째 인덱스에 대해서는 이미 할당을 해주고 넘어가기 때문에 해당 조건에 대해서는 더이상 탐색하지 않으려고 visited[a]가 true면 return 0을 해줬었는데, 당연히 그러면 a가 0이 아닌 1,2,3인 경우에도 추가적인 탐색을 해주지 않기 때문에 에러가 납니다.

a==0인 경우 return 0으로 변경하고, 그 외의 경우에는 visited[a] ==visitCnt 인 경우에만 return 1을 수행했습니다.

visitCnt로 체크하는 이유는 같은 탐색을 무한루프로 도는 것을 방지하기 위함입니다. 

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