Post

leetcode(리트코드)6-ZigZag Conversion

leetcode 6 - ZigZag Conversion 문제입니다.

1. 문제

https://leetcode.com/problems/zigzag-conversion/


2. Input , Output


3. 분류 및 난이도

Medium 난이도 문제입니다.
leetcode Top 100 Liked의 문제입니다.


4. 문제 해석

  • 규칙을 이용해서 만든 문자열을 리턴합니다.
  • 브루트 포스로는 힘들어보이고, 규칙이 있어서 그것을 이용합니다.
  • 규칙은 Nums이 4가 들어올 경우 첫줄은 6 0 / 두번째 줄 4 2 / 세번째줄 2 4 / 네번째줄 0 6 이렇게 인덱스가 이동하고 Nums가 5인 경우 8 0 / 6 2 / 4 4 / 2 6 / 0 8 이런식으로 인덱스가 이동합니다.

5. code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
    string convert(string s, int numRows) {
        //iter는 인덱스를 움직이기 위한 초기값입니다.
        int iter = (numRows-1)*2;
        //numRows가 1이거나 문자열보다 크면 그냥 문자열을 반환해야합니다.
        if(numRows==1 || numRows > s.size())
            return s;
        string result="";
        for(int i = 0;i<numRows;++i)
        {
            //처음 접근하는 numRows는 넣어줍니다.
            result+=s[i];
            // right는 왼쪽의 규칙성입니다. !8! 0 !6! 2.. 이런식으로 동작합니다. 코드를 쓰고나니 left와 right를 반대로 썼네요..
            int right = iter-(i*2);
            // left는 right와 반대입니다. 8 !0! 6 !2! 이런식으로 동작합니다.
            int left = iter-right;
            //초기 인덱스값입니다.
            int index = i;
            //문자열을 넘지 않도록 잘 조절합니다.
            for(;index<s.size();)
            {
                //항상 넘지 않도록 조건문을 달아줍니다.
                if(s.size()<=index+right)
                    break;
                //0인경우는 더해봤자 중복값이 들어가므로 무시합니다.
                if(right!=0 && s[index+right]!=' ')
                    result+=s[index+right];
                index+=right;
                if(s.size()<=index+left)
                    break;
                if(left!=0 && s[index+left]!=' ')
                {
                    result+=s[index+left];
                }
                index+=left;
            }
        }
        return result;
    }
};

6. 결과 및 후기, 개선점

시간(89%)

시간 0ms(100%)코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Solution {
public:
    string convert(string s, int numRows) {
        //크기가 1인 경우 리턴
        if( 1 == numRows) return s;
        
        size_t input_size = s.size();
        string result(input_size,0);
        
        //functionSwitch는 어느 시점에서 배열의 인덱스를 넘을 지 모르므로 관리하는 boolean타입의 변수입니다.
        bool functionSwitch = true;
        //output_counter는 s의 인덱스를 관리합니다.
        size_t output_counter = 0;
        //input_counter는 result의 인덱스를 관리합니다.
        size_t input_counter = 0;
        
        for(int row_counter = 1; row_counter <= numRows; row_counter++)
        {
            //첫 번째 규칙을 적굥합니다.
            functionSwitch = true;
            output_counter = row_counter - 1;
            
            while(output_counter < input_size)
            {
                //첫 번째 규칙
                if(functionSwitch)
                {
                    result[input_counter] = s[output_counter];
                    functionSwitch = false;
                    
                    // 위에서 설명한 numRows와 같은 경우는 중복값을 저장할 수 있으므로 생략합니다.
                    if(row_counter == numRows) continue;
                    //규칙
                    output_counter += 2*(numRows - row_counter);
                }
                else
                {
                    result[input_counter] = s[output_counter];
                    functionSwitch = true;
                    
                    //중복값 무시
                    if(row_counter == 1) continue;
                    //규칙
                    output_counter += 2*(row_counter - 1);
                }
                
                input_counter++;
            }
        }
        return result;
    }
};
This post is licensed under CC BY 4.0 by the author.