λ¬Όλ‘ μ΄μ£ ! μλλ TIL λ¬Έμλ‘ μ¬μ©ν μ μλλ‘ μ 리ν λ΄μ©μ λλ€.
The Tortoise and Hare Algorithm, λλ Floyd's Cycle Detection Algorithmμ μ°κ²° 리μ€νΈμμ μ¬μ΄ν΄μ΄ μλμ§ νμ§νλ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν μκ³ λ¦¬μ¦μ λλ€. μ΄ μκ³ λ¦¬μ¦μ λ κ°μ ν¬μΈν°(νλλ λλ¦¬κ² μ΄λνκ³ , λ€λ₯Έ νλλ λΉ λ₯΄κ² μ΄λνλ ν¬μΈν°)λ₯Ό μ΄μ©νμ¬ λ¦¬μ€νΈλ₯Ό μννλ©΄μ, μ¬μ΄ν΄μ΄ μ‘΄μ¬νλμ§ νμ§ν©λλ€.
- Tortoise (κ±°λΆμ΄): ν λ²μ ν μΉΈμ© μ΄λνλ ν¬μΈν° (
slow). - Hare (ν λΌ): ν λ²μ λ μΉΈμ© μ΄λνλ ν¬μΈν° (
fast).
λ ν¬μΈν°λ μ°κ²° 리μ€νΈλ₯Ό μννλ©΄μ, λ§μ½ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ€λ©΄ κ²°κ΅ λ§λκ² λ©λλ€. μ¬μ΄ν΄μ΄ μμΌλ©΄ fast ν¬μΈν°κ° λμ λλ¬νκ³ νμμ μ’
λ£νκ² λ©λλ€.
-
μ΄κΈ°ν:
- λ ν¬μΈν°
slowμfastλ 리μ€νΈμheadμμ μμν©λλ€.
- λ ν¬μΈν°
-
ν¬μΈν° μ΄λ:
slowλ ν λ²μ ν μΉΈμ© μ΄λνκ³ ,fastλ ν λ²μ λ μΉΈμ© μ΄λν©λλ€.
-
λ§λ¨ νμ§:
slowμfastκ° κ°μ λ Έλλ₯Ό κ°λ¦¬ν€λ©΄, μ΄λ 리μ€νΈμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ€λ λ»μ λλ€.
-
μ¬μ΄ν΄μ΄ μλ κ²½μ°:
fastκ°nullμ λλ¬νλ©΄, μ¬μ΄ν΄μ΄ μλ€κ³ νλ¨νκ³ μ’ λ£ν©λλ€.
-
μκ° λ³΅μ‘λ: O(n)
- 리μ€νΈμ λͺ¨λ λ
Έλλ₯Ό ν λ²μ©λ§ νμνλ―λ‘, 리μ€νΈμ λ
Έλ κ°μκ°
nμΌ λ **O(n)**μ μκ°μ΄ μμλ©λλ€.
- 리μ€νΈμ λͺ¨λ λ
Έλλ₯Ό ν λ²μ©λ§ νμνλ―λ‘, 리μ€νΈμ λ
Έλ κ°μκ°
-
κ³΅κ° λ³΅μ‘λ: O(1)
- λ κ°μ ν¬μΈν°λ§ μ¬μ©νλ―λ‘ μΆκ°μ μΈ λ©λͺ¨λ¦¬ μ¬μ©μ΄ κ±°μ μμΌλ©°, μμ 곡κ°λ§ μ°¨μ§ν©λλ€.
class ListNode {
val: number;
next: ListNode | null;
constructor(val?: number, next?: ListNode | null) {
this.val = (val === undefined ? 0 : val);
this.next = (next === undefined ? null : next);
}
}
function hasCycle(head: ListNode | null): boolean {
if (!head || !head.next) {
return false; // 리μ€νΈκ° λΉμ΄μκ±°λ λ
Έλκ° νλλΏμ΄λ©΄ μ¬μ΄ν΄μ΄ μμ μ μμ
}
let slow: ListNode | null = head;
let fast: ListNode | null = head;
while (fast && fast.next) {
slow = slow!.next; // ν μΉΈμ© μ΄λ
fast = fast.next.next; // λ μΉΈμ© μ΄λ
if (slow === fast) {
return true; // slowμ fastκ° λ§λλ©΄ μ¬μ΄ν΄μ΄ μμ
}
}
return false; // fastκ° nullμ λλ¬νλ©΄ μ¬μ΄ν΄μ΄ μμ
}μ°κ²° 리μ€νΈκ° λ€μκ³Ό κ°λ€κ³ κ°μ :
3 -> 2 -> 0 -> -4
^ |
|_________|
- λ§μ§λ§ λ
Έλ
-4λ 1λ² λ Έλ2λ‘ μ°κ²°λμ΄ μ¬μ΄ν΄μ΄ λ°μν©λλ€. hasCycleν¨μλ μ΄ μ°κ²° 리μ€νΈμμ λ ν¬μΈν°κ° λ°λ³΅ν΄μ μνν λ€ λ§λ¨μ κ°μ§νμ¬ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν¨μ λ°νν©λλ€.
- The Tortoise and Hare Algorithmμ κ°λ¨νλ©΄μλ λ§€μ° ν¨μ¨μ μΈ μ¬μ΄ν΄ νμ§ μκ³ λ¦¬μ¦μ λλ€.
- μκ° λ³΅μ‘λλ O(n), κ³΅κ° λ³΅μ‘λλ O(1)λ‘ λκ·λͺ¨ λ°μ΄ν°μμλ μ±λ₯μ΄ λ°μ΄λ©λλ€.
- μ΄ μκ³ λ¦¬μ¦μ μ°κ²° 리μ€νΈλΏλ§ μλλΌ, λ€λ₯Έ μν ꡬ쑰λ₯Ό κ°μ§ λ°μ΄ν° ꡬ쑰μλ μμ©ν μ μμ΅λλ€.
μ΄ λ¬Έμκ° TIL νμμΌλ‘ μ ν©νκΈΈ λ°λλλ€! νμν μμ μ¬νμ΄ μκ±°λ λ€λ₯Έ ν¬λ§·μΌλ‘ μμ±μ΄ νμνλ©΄ λ§μν΄ μ£ΌμΈμ!