Algorithm Floyd's Tortoise and Hare Algorithm
알고리듬 Floyd's Tortoise and Hare Algorithm을 알아보겠습니다. 플로이드의 거북이와 토끼 알고리듬입니다. 이름이 너무 재미있지요. 순환을 찾는(Circle detect) 알고리듬 중 하나입니다. 토끼는 두 칸씩 뛰어가고 거북이는 한 칸씩 이동하면서 순환되는 부분을 찾는 알고리듬입니다. 이렇게 순환이 생기는 링크드 리스트가 있습니다. 여기서 플로이드 거북이와 토끼 알고리듬을 이용해서 순환이 발생하는지 확인하고, 그 시작 위치를 찾는 법을 알아봅시다. 거북이는 한 칸, 토끼는 두 칸씩 나아갑니다. 토끼와 거북이가 5에서 만났기 때문에 이 링크드 리스트는 순환하는 구조입니다. 여기서 재미있는 성질이 있습니다. 처음 순환이 발생하는 위치는 어떻게 구할까요? 우리가 보기에 3에서 순환이 발생하잖아요. 이것을 어떻게 찾냐하면 다음과 같이 찾습니다. 거북이를 원래 위치로 보내고, 거북이와 토끼를 한 칸씩 만날 때까지 움직이면 됩니다. 짜잔. 이것이 어떻게 가능한지 증명해 볼까요? 순환이 시작되는 점까지의 거리를 l 순환 시작점부터 거북이와 토끼가 만나는 점까지를 m 순환하는 전체 부분을 c라고 표기합니다. 거북이가 이동한 거리를 t라고 한다면, t = l + c * x + m입니다. 토끼가 이동한 거리를 h라고 한다면, h = l + c * y + m입니다. 토끼는 거북이보다 2 배 이동하니까 2t = h가 성립되어서 2(l + c * x + m) = l + c * y + m이 됩니다. ...