본문 바로가기
코딩테스트

C++ ] leetCode 6 - Zigzag Conversion

by eteo 2024. 3. 14.

 

 

leetCode 6번 문제

 

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

 

string convert(string s, int numRows);

 

 

Example 1:

  • Input: s = "PAYPALISHIRING", numRows = 3
  • Output: "PAHNAPLSIIGYIR"

 

Example 2:

  • Input: s = "PAYPALISHIRING", numRows = 4
  • Output: "PINALSIGYAHRPI"
  • Explanation:

 

Example 3:

  • Input: s = "A", numRows = 1
  • Output: "A"

 

 

Constraints:

  • 1 <= s.length <= 1000
  • s consists of English letters (lower-case and upper-case), ',' and '.'.
  • 1 <= numRows <= 1000

 

numRows 만큼 행 별 문자들을 저장할 string 배열을 만들고 문자열을 순회하면서 문자를 집어넣어야 하는데 행의 인덱스가 0이거나 numRows - 1에 도달했을 때는 방향을 전환하면서 증감하면 된다.

 

처음에 goingDown을 true로 시작하는건 첫 turn이 0이기 때문에 그렇다. 마지막엔 모든 행의 문자열을 순서대로 합쳐 반환하면 된다.

 

 

 

 

 

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1 || numRows >= s.length()) return s;

        vector<string>rows(numRows);
        int turn = 0;
        bool goingDown = true;

        for(int i = 0; i < s.length(); i++) {
            rows[turn] += s[i];
            if(turn == 0 || turn == numRows - 1) goingDown = !goingDown;
            if(goingDown) turn--;
            else turn++;
        }

        s.clear();
        for(auto &c : rows) {
            s += c;
        }        
        return s;
    }
};