Floyd's Cycle Detection

ν”Œλ‘œμ΄λ“œμ˜ μˆœν™˜ 감지 μ•Œκ³ λ¦¬μ¦˜: μ—°κ²° 리슀트 μˆœν™˜μ„ μ°ΎλŠ” κ°€μž₯ 효율적인 방법

문제 상황 및 ν•΄κ²° 방법

μ—°κ²° 리슀트(LinkedList)μ—μ„œ 순횐(cycle)μ΄λž€, μ—°κ²° λ¦¬μŠ€νŠΈκ°€ 자기 μžμ‹ μœΌλ‘œλΆ€ν„° λ£¨ν”„λ°±λ˜λŠ” 것을 μ˜λ―Έν•˜λ©°, λ°˜λ“œμ‹œ 리슀트의 μ‹œμž‘μ μœΌλ‘œ λŒμ•„κ°€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

첫 번째 접근법: λ…Έλ“œ λ§ˆν‚Ή

// 각 λ…Έλ“œλ₯Ό λ°©λ¬Έν•  λ•Œ λ§ˆν‚Ήν•˜λŠ” 방법
public boolean hasCycle(ListNode head) {
    Set<ListNode> visited = new HashSet<>();
    
    while (head != null) {
        if (visited.contains(head)) {
            return true;  // 이미 λ°©λ¬Έν•œ λ…Έλ“œ 발견
        }
        visited.add(head);
        head = head.next;
    }
    
    return false;
}

문제점:

  • 곡간 λ³΅μž‘λ„ O(n): λͺ¨λ“  λ…Έλ“œλ₯Ό μ €μž₯ν•΄μ•Ό 함

  • μ—°κ²° 리슀트 μˆ˜μ • λΆˆκ°€λŠ₯ν•œ 경우 μ‚¬μš©ν•  수 μ—†μŒ

ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜

핡심 아이디어: μ„œλ‘œ λ‹€λ₯Έ μ†λ„λ‘œ μ›€μ§μ΄λŠ” 두 개의 포인터 μ‚¬μš©

  • slow 포인터: 1μΉΈμ”© 이동

  • fast 포인터: 2μΉΈμ”© 이동

example. 레이슀 νŠΈλž™

μ—°κ²° 리슀트λ₯Ό λ ˆμ΄μŠ€νŠΈλž™μ΄λΌκ³  μƒκ°ν•΄λ³΄μ„Έμš”. 두 λŒ€μ˜ μžλ™μ°¨κ°€ μ„œλ‘œ λ‹€λ₯Έ μ†λ„λ‘œ νŠΈλž™μ„ 달리고 μžˆμŠ΅λ‹ˆλ‹€.

핡심 원리:

  1. 루프가 μžˆλ‹€λ©΄: λΉ λ₯Έ μ°¨κ°€ κ²°κ΅­ 느린 μ°¨λ₯Ό λ”°λΌμž‘μ•„ 좩돌

  2. 루프가 μ—†λ‹€λ©΄: λΉ λ₯Έ μ°¨κ°€ λ¨Όμ € νŠΈλž™ 끝에 도달

κ΅¬ν˜„ 및 μ£Όμ˜μ‚¬ν•­

❌ 잘λͺ»λœ κ΅¬ν˜„

문제점:

  1. 초기 μœ„μΉ˜ 문제: fast와 slowκ°€ λͺ¨λ‘ headμ—μ„œ μ‹œμž‘ν•˜λ©΄ 첫 번째 λΉ„κ΅μ—μ„œ λ°”λ‘œ true λ°˜ν™˜

  2. Null Pointer Exception: fast.next.nextμ—μ„œ fast.nextκ°€ null일 수 있음

βœ… μ˜¬λ°”λ₯Έ κ΅¬ν˜„

  1. μ„œλ‘œ λ‹€λ₯Έ μ‹œμž‘ μœ„μΉ˜

  • μ²˜μŒλΆ€ν„° 같은 μœ„μΉ˜μ— μžˆμ§€ μ•Šλ„λ‘ 함

  • 첫 번째 λ£¨ν”„μ—μ„œ λ°”λ‘œ trueκ°€ λ°˜ν™˜λ˜λŠ” 것을 λ°©μ§€

  1. null 체크

  • fast != null: fast μžμ²΄κ°€ null이 μ•„λ‹˜μ„ 확인

  • fast.next != null: fast.next.next μ ‘κ·Ό 전에 μ•ˆμ „μ„± 보μž₯

  • slow != null: 완전성을 μœ„ν•œ 체크 (μ‹€μ œλ‘œλŠ” λΆˆν•„μš”ν•  수 있음)

  • 이둜 인해 μ•ˆμ „ν•œ 포인터 이동이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν™œμš©

1. μˆœν™˜ 쑴재 μ—¬λΆ€ 확인

2. μˆœν™˜ μ‹œμž‘μ  μ°ΎκΈ°

3. μˆœν™˜μ˜ 길이 κ΅¬ν•˜κΈ°

μ‹œκ°„/곡간 λ³΅μž‘λ„

μ‹œκ°„ λ³΅μž‘λ„: O(n)

  • μˆœν™˜μ΄ μ—†λŠ” 경우: 토끼가 λκΉŒμ§€ κ°€λ―€λ‘œ O(n)

  • μˆœν™˜μ΄ μžˆλŠ” 경우: μ΅œμ•…μ˜ 경우 토끼가 μˆœν™˜μ„ ν•œ 바퀴 돌기 전에 λ§Œλ‚¨

곡간 λ³΅μž‘λ„: O(1)

  • μΆ”κ°€ 자료ꡬ쑰 없이 두 개의 ν¬μΈν„°λ§Œ μ‚¬μš©

  • μž…λ ₯ 크기와 λ¬΄κ΄€ν•˜κ²Œ μΌμ •ν•œ λ©”λͺ¨λ¦¬ μ‚¬μš©

μ‘μš©

1. 각 자리 제곱 수의 합이 1이 λ˜κ±°λ‚˜ μˆœν™˜

2. λ°°μ—΄μ—μ„œ 쀑볡 μ°ΎκΈ°: λ°°μ—΄μ˜ 값을 인덱슀둜 μ‚¬μš©ν•˜μ—¬ μˆœν™˜ 감지

기본 문제

μ‘μš© 문제

Last updated