Skip to content

Commit 318d572

Browse files
committed
linked list cycle solution
1 parent 65c04e6 commit 318d572

1 file changed

Lines changed: 79 additions & 0 deletions

File tree

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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

Comments
ย (0)