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차원배열로도 충분히 가능한 수준의 문제였다.