teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

フォーマンスを向上させた

2018/01/06 19:18

投稿

MasakiHori
MasakiHori

スコア3391

answer CHANGED
@@ -59,9 +59,14 @@
59
59
 
60
60
  return [self]
61
61
  }
62
+ // 要素数が 2 * num 以下の時
63
+ if count <= num * 2 {
64
+
65
+ return [Array<Element>(self[0..<num])]
66
+ + [Array<Element>(self[num...])]
67
+ }
62
68
 
63
69
  // 前半の要素数が num の整数倍になるように分割点を求める
64
- // 後半の要素数が多くなるように設定
65
70
  let splitPoint = Int(count / num / 2) * num
66
71
 
67
72
  switch splitPoint {
@@ -79,10 +84,9 @@
79
84
  + Array<Element>(self[splitPoint..<count]).split(num: num)
80
85
 
81
86
  default:
82
- // 後半の要素数が num 以上の時
87
+ // ここには到達しない
83
88
 
84
- return [Array<Element>(self[0..<num])]
89
+ fatalError("Not reachable")
85
- + Array<Element>(self[num..<count]).split(num: num)
86
90
  }
87
91
  }
88
92
  }

2

パフォーマンスを向上させた

2018/01/06 19:18

投稿

MasakiHori
MasakiHori

スコア3391

answer CHANGED
@@ -28,4 +28,62 @@
28
28
  let myClasses = ["abc", "def", "ghi", "jkl", "mno"]
29
29
 
30
30
  let splited = myClasses.split(num: 2)
31
+ ```
32
+
33
+
34
+ ---
35
+ 追記
36
+
37
+ あまりにもパフォーマンスが悪すぎるので書き直しました。
38
+ 多分O(N)ぐらいになってます。
39
+ 複雑になったので説明コメント多めです。
40
+
41
+ ```swift
42
+ extension Array {
43
+
44
+ /// 配列を要素数が num の配列の配列にする
45
+ ///
46
+ /// let array = [1, 2, 3, 4, 5]
47
+ /// let splited = array.split(num: 2)
48
+ /// print(splited)
49
+ /// // [[1, 2], [3, 4], [5]]
50
+ func split(num: Int) -> [[Element]] {
51
+
52
+ /// 配列を半分に分けて前半後半それぞれをもう一度半分に分ける
53
+ /// これを要素数が num 以下になるまで繰り返す
54
+
55
+ let count = self.count
56
+
57
+ // 要素数が num 以下の時
58
+ if count <= num {
59
+
60
+ return [self]
61
+ }
62
+
63
+ // 前半の要素数が num の整数倍になるように分割点を求める
64
+ // 後半の要素数が多くなるように設定
65
+ let splitPoint = Int(count / num / 2) * num
66
+
67
+ switch splitPoint {
68
+
69
+ case num:
70
+ // 前半の要素数が num の時
71
+
72
+ return [Array<Element>(self[0..<num])]
73
+ + Array<Element>(self[num..<count]).split(num: num)
74
+
75
+ case (num...):
76
+ // 前半の要素数が num 以上の時
77
+
78
+ return Array<Element>(self[0..<splitPoint]).split(num: num)
79
+ + Array<Element>(self[splitPoint..<count]).split(num: num)
80
+
81
+ default:
82
+ // 後半の要素数が num 以上の時
83
+
84
+ return [Array<Element>(self[0..<num])]
85
+ + Array<Element>(self[num..<count]).split(num: num)
86
+ }
87
+ }
88
+ }
31
89
  ```

1

少しだけ早く

2018/01/06 18:25

投稿

MasakiHori
MasakiHori

スコア3391

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  return (divided, [])
12
12
  }
13
13
 
14
- if source.count < num {
14
+ if source.count <= num {
15
15
  return (divided + [source], [])
16
16
  }
17
17