Zigzag Conversion

zoovely·2024년 5월 6일
0
post-thumbnail

💬 문제

[문제 링크]

문자열 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가 느리다는 걸 알 수 있었다.

profile
나도 할 수 있을까?

0개의 댓글