문자열 s를 정수 numRows 깊이만큼 지그재그(W 모양)로 변환
변환 후 첫 줄부터 마지막 줄 순서로 이어붙인 문자열 반환
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
P A H N
A P L S I I G
Y I R
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
if (numRows === 1)
return s;
let zigzag = new Array(numRows).fill('');
let down = true;
let idx = 0;
for (let i = 0; i < s.length; i++) {
zigzag[idx] += s[i];
idx = down ? idx + 1 : idx - 1;
if (idx === 0 || idx === numRows - 1)
down = !down;
}
return zigzag.reduce((prev, curr) => prev + curr, '');
};
우선 numRows가 1이면 문자열 그대로이기 때문에 예외처리
이 외에는 numRows 만큼 문자열 배열을 만들고
s 순회하면서 문자 하나씩 순차적으로 넣어줌
idx는 현재 넣어야 할 zigzag 배열의 인덱스
down은 밑으로 가는 중인지, 올라가는 중인지에 대한 플래그
idx가 0으로 시작해서 numsRow - 1에 도달하면 down을 false로 바꿔서
다시 0으로 줄어들게 끔 변경
이후 zigzag 배열의 reduce() 통해 이어붙인 문자열 반환
Accepted
Runtime 95ms (Beats 39.98%)
Memory 52.74MB (Beats 97.96%)
처음에는 굳이 문자열 배열 안만들고 s만 순회하면서 문자열을 만들 수 없을까?하다가 깔끔하게 포기하고 배열 만들어서 구현했다. 아래로 내려갔다가 다시 올라오는 방향 회전 때문에 잠시 헷갈렸지만 정리했는데, numRows가 1일 때 해당 코드로는 결과가 나오지 않았다. 결국 그 부분만 예외처리해주는 것으로 해결했다. 그리고 나서 런타임이 너무 오래 걸리길래 reduce가 문제인가 싶어서 for문 돌면서 이어붙여 봤는데 결과가 85ms(72.36%) 53.79MB(75.41%)
로 나왔다. 이어 붙일 문자열 변수 선언 때문에 메모리가 아주 조금 늘었지만, 런타임은 많이 줄어든걸 보니 확실히 reduce가 느리다는 걸 알 수 있었다.