1+ /**
2+ * Definition for singly-linked list.
3+ * public class ListNode {
4+ * public var val: Int
5+ * public var next: ListNode?
6+ * public init(_ val: Int) {
7+ * self.val = val
8+ * self.next = nil
9+ * }
10+ * }
11+ */
12+
13+ // 1์ฐจ ๋ฒ์ : ๋ฌธ์ ์ constraint์ ๋ฐ๋ผ 1๋ง ๋ฒ์ traverse๋ฅผ ์ํํ๋ ๋ต์ (ํต๊ณผ๋ ๋ฉ๋๋ค)
14+ class Solution {
15+ func hasCycle( _ head: ListNode ? ) -> Bool {
16+ guard let head else { return false }
17+
18+ return traverse ( head, 0 )
19+ }
20+
21+ func traverse( _ node: ListNode ? , _ currentIndex: Int ) -> Bool {
22+ guard let node else { return false }
23+ guard currentIndex < 10000 else { return true }
24+
25+ return traverse ( node. next, currentIndex + 1 )
26+ }
27+ }
28+
29+ // LLM ์ฒจ์ญ ๋ฒ์ : Floyd's Cycle Detection Algorithm ์ฌ์ฉ
30+ class Solution {
31+ func hasCycle( _ head: ListNode ? ) -> Bool {
32+ guard let head else { return false }
33+
34+ var slow : ListNode ? = head
35+ var fast : ListNode ? = head
36+
37+ while true {
38+ // fast๋ ํ ๋ฒ์ ๋ ์นธ์ฉ ์ด๋
39+ fast = fast? . next? . next
40+
41+ // slow๋ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋
42+ slow = slow? . next
43+
44+ // fast๋ slow๊ฐ nil์ด๋ฉด cycle์ด ์๋ค
45+ if fast == nil || slow == nil { return false }
46+
47+ // fast์ slow๊ฐ ๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉด cycle์ด ์๋ค
48+ // break๋ก ๋ง๋ฌด๋ฆฌํ ์ด์ ๋, ๊ทธ๋์ ๊ทธ ๋ง๋๋ ๋
ธ๋๊ฐ ์ด๋์ธ๊ฐ? ๋ผ๋ ๋ฌธ์ ์ ์์ฉํ๊ธฐ ์ํจ
49+ if fast === slow { break }
50+ }
51+
52+ // ์ฌ์ดํด ์์ ์ง์ ์ ์ฐพ๋ ๋ฌธ์ ์ผ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ entry ํฌ์ธํฐ ์ฝ์
ํ ํ์
53+
54+ return true
55+ }
56+ }
57+
58+ /*
59+ ์ฌ์ดํด ์์ ์ง์ ์ ์ฐพ์ผ์์ค, ๋ผ๋ ๋ฌธ์ ์ผ ๊ฒฝ์ฐ?
60+ entry๋ผ๋ ๋ณ๋์ ํฌ์ธํฐ๋ฅผ ํ๋ ๋ ๋ ๋ค์ slow์ ํจ๊ป ํ ์นธ์ฉ ์ด๋์ํจ๋ค.
61+ ๋ ํฌ์ธํฐ๊ฐ ๋ง๋๋ ์ง์ ์ด ์ฌ์ดํด ์์ ์ง์ !
62+ ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋, ์๋์ ์ด๋ ๊ฑฐ๋ฆฌ ๊ณต์ ๋๋ฌธ์ ๊ทธ๋ ๋ค.
63+
64+ L: ์ฌ์ดํด ์
๊ตฌ๊น์ง์ ๊ธธ์ด
65+ C: ์ฌ์ดํด ๊ธธ์ด
66+ d: ์ฌ์ดํด ๋ด์์, ์ฌ์ดํด ์ข
๋ฃ(==์์)๊น์ง ๋จ์ ๊ฑฐ๋ฆฌ
67+
68+ fast์ ์ด๋ ๊ฑฐ๋ฆฌ: L + n * C + d
69+ slow์ ์ด๋ ๊ฑฐ๋ฆฌ: L + d
70+
71+ fast์ ์ด๋ ๊ฑฐ๋ฆฌ๋ slow์ ์ด๋ ๊ฑฐ๋ฆฌ์ 2๋ฐฐ์ด๋ฏ๋ก
72+ 2 * (L + d) = L + n * C + d
73+
74+ ๋ฐ๋ผ์, L = n * C - d ์ด๋ค.
75+ ๊ทธ๋ฆฌ๊ณ L์ entry ํฌ์ธํฐ๊ฐ ์ด๋ํด์ผ ํ๋ ๊ฑฐ๋ฆฌ์ด๋ค.
76+ n * C - d๋ ์ฌ์ดํด ์์์๋ C - d์ ๊ฐ๋ค. fast ๋
ธ๋๊ฐ n๋ฒ ๋์์ ๋ฟ, ์ฌ์ดํด ์์ด์๊ธฐ ๋๋ฌธ.
77+ ๋ฐ๋ผ์ entry ํฌ์ธํฐ์ slow ํฌ์ธํฐ๋ฅผ ๋ค์ ํ ์นธ์ฉ ์ด๋์ํค๋ค ๋ณด๋ฉด, ๋ฐ๋์ ๋ง๋๊ฒ ๋๋ค.
78+ ์ด ๋ง๋๋ ์ง์ ์ด ์ฌ์ดํด ์์ ์ง์ .
79+ */
0 commit comments