1
+ /*
2
+ Runtime 380 ms
3
+ Beats 94.83%
4
+ --------------
5
+ Memory 160.4 MB
6
+ Beats 43.10%
7
+ */
8
+
9
+ // import 'package:flutter_test/flutter_test.dart';
10
+
11
+ class Solution {
12
+ late final int _sliceLen;
13
+
14
+ String convert (String s, int numRows) {
15
+ // numRows 가 1인경우, 원본 스트링을 그대로 반환하면 된다.
16
+ if (numRows == 1 ) return s;
17
+ _sliceLen = numRows + (numRows - 2 );
18
+ List <List <String >> ans = List .generate (numRows, (index) => []);
19
+ for (int i = 0 ; i < s.length; i = i + _sliceLen) {
20
+ int endIdx = i + _sliceLen < s.length ? i + _sliceLen : s.length;
21
+ _reorderString (ans, s.substring (i, endIdx), numRows);
22
+ }
23
+
24
+ return ans.map ((e) => e.join ()).join ();
25
+ }
26
+
27
+ void _reorderString (List <List <String >> ans, String slicedString, int numRows) {
28
+ for (int idx = 0 ; idx < slicedString.length; idx++ ) {
29
+ if (idx == 0 || idx == numRows - 1 || idx < numRows) {
30
+ ans[idx].add (slicedString[idx]);
31
+ continue ;
32
+ }
33
+ ans[_sliceLen - idx].add (slicedString[idx]);
34
+ }
35
+ }
36
+ }
37
+
38
+ /*
39
+ TEST_CODE
40
+ --------
41
+ void main() {
42
+ group(
43
+ "Zigzag Conversion",
44
+ () {
45
+ late Solution solution;
46
+ setUp(() {
47
+ solution = Solution();
48
+ });
49
+
50
+ test('case01', () => expect(solution.convert("PAYPALISHIRING", 3), equals("PAHNAPLSIIGYIR")));
51
+ test('case02', () => expect(solution.convert("PAYPALISHIRING", 4), equals("PINALSIGYAHRPI")));
52
+ test('case03', () => expect(solution.convert("A", 1), equals("A")));
53
+ },
54
+ );
55
+ }
56
+ */
0 commit comments