Computer Science/코딩테스트

LeetCode #6 Zigzag Conversion

Seongwoo 2022. 7. 12. 11:23

문제

"PAYPALISHIRING" 문자열은 다음과 같이 주어진 행 수에 지그재그 패턴으로 작성됩니다. (가독성을 높이기 위해 이 패턴을 고정 글꼴로 표시할 수 있습니다.)

P   A   H   N
A P L S I I G
Y   I   R

그런 다음 "PAHNAPLSIIGYIR"을 한 줄씩 읽습니다.

문자열을 취하고 주어진 행의 수를 이 변환하는 코드를 작성하십시오:

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:
P     I    N
A   L S  I G
Y A   H R
P     I

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

제출코드

var convert = function(s, numRows) {
  if (s.length <= numRows || numRows < 2) return s;
  let sLength = s.length;
  let num = 2 * (numRows - 1);
  let arr = Array(numRows).fill('');
  let tmp = 0;
  for (let i = 0; i < sLength; i++) {
    tmp = i % num;
    if (tmp < numRows) {
      arr[tmp] += s[i];
    } else {
      arr[num - tmp] += s[i];
    }
  }
  return arr.join('');
};

문제풀이

사이클의 크기를 계산 한 후 해당 사이클에 맞게 각 배열에 문자를 대입한다음 다시 문자열로 변경해주면된다.

2차원배열로 풀어보았는데 효율도 너무 떨어지고 복잡하기만 했다. 조금만 생각을 바꿔보니 1차원배열로도 충분히 가능한 수준의 문제였다.