나에게는 제법 난이도 있는 문제중 하나이다.
저번에 DFS글이 배열을 다루는 것이였다면
이번 글은 그래프를 다루는 글이 될것 이다.
아마 알고리즘을 나와 같이 처음 접하고 문제를 푸는 사람이라면 이런 문제에서 손도 못댈 것 같다..
현재는 어느정도 느낌을 잡고 푸는 중이다.
풀이 코드이다.
우리가 가장 중요시 해야하는 점은 바둑판같은 배열을 만드는 것이 아니라
내가 갔다온 지점은 기억을 해야 한다
이 부분이 가장 중요하다.
저 부분을 하는 역할은 ch배열이다.
자 일단 체크 배열이라고 하는 ch배열 과 바둑판처럼 2차원 배열을 만들었다.
일단 기본적인 그래프 문제는 모두다 재귀를 통해서 해결을 해야한다.
내가 짠 코드는 모든 경우를 다 돌기 떄문에 비효율적인 재귀라고 할수가 있다.
재귀에 들어가는 값인 idx
값은 현재 내 위치를 말한다.
그뒤 재귀를 돌게 되는데 for문의 최대 값이 N인 이유는 우리가 1에서 트리구조로 펼쳐 보았을떄 다음에 올수 있는 값들은 총 4개이기 떄문이다.
처음에 1의 위치에 있다고 생각을 해보자
그럼 1다음에 갈수 있는 경우의 수는 2,3,4,5가 될것이다.
이것을 for문의 i로 표현한 것이다.
그후 내가 갔다온 지점인지를 확인하는 체크배열,
길이 있는지 = 값이 1인지를 확인한뒤
성공하면 DFS를 돌게 된다.
이떄 중요한 점은 체크 배열을 수정해야 한다는 점이다.
앞서 보였던 코드는 모든 경우의 수를 다 돌게 된다.
이것이 좀더 효율적인 재귀 코드이다.
똑같이 체크 배열은 존재한다.
이 board는 바둑판처럼 형성이 되어 있지 않다.
직접 짜본다면 어떻게 이루어져 있는지는 알수 있을 것이다.
이번에도 for문을 보면 해당 위치에 있는 board의 경로 만큼만 돌게 된다.
예시를 보면
1번에서 갈수 있는 길은 2,3,4이다.
전에는 2,3,4,5 까지 모두 돌면서 경로를 확인했지만
우리는 갈수 있는 길이 2,3,4라는 것을 알고 있기 때문에
2,3,4만큼만 돌면 되는 것이다.
이 코드는 써놓은 것처럼 효율적으로 있는 길만 탐색을 할수가 있으며
따로 board에 길이 있는지를 확인하지 않아도 된다.
그뒤 DFS를 board에 들어가 있는 길의 값을 넣어주면 통과가 된다.
이 문제도 예전에 맛만 봣다가 짠맛을 보고 바로 도망쳤던 문제이다.
바로 코드를 보며 설명을 해보겠다.
일단 우리는 해당 위치에서 위, 오른쪽, 아래, 왼쪽
순서로 길이 있는지를 확인할 것이다.
dx, dy
변수 이다.그후 도착지를 arrive
변수로 설정해 준다.
이러한 그래프 문제의 특징은 자기의 위치를 체크해가면서 풀어야 한다는 점이다.
이전 문제도 그렇고 DFS에는 자신의 위치가 들어가게 된다.
그후 이동할 위치를 new
변수에 담고 해당 위치가 배열 밖에는 있지 않은지 또 길이 있는지를 확인하면서 for문이 돌게 된다.
그후 길이 있다면 1로 내가 지나간다는 표시를 하고 DFS를 다시 돌리게 된다.
이 문제 또한 좀만 생각해서 어떻게 작동을 하는지 알면 굉장히 비효율적이라는 것을 알수가 있다.