Text Justification

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

💬 문제

[문제 링크]

단어가 들어있는 문자열 배열 words
정수 maxWidth를 넘지 않도록 단어를 문장으로 연결
남는 자리는 띄어쓰기로 채우되, 균등하게 띌 수 없는 경우
오른쪽보다 왼쪽의 공백이 더 많도록 함
문장에 단어가 한 개거나 마지막 문장은 왼쪽 정렬

Input: words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16
Output:
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]

✍️ 나의 풀이

/**
 * @param {string[]} words
 * @param {number} maxWidth
 * @return {string[]}
 */
var fullJustify = function(words, maxWidth) {
    let res = [];

    let line = words[0];
    for (let i = 1; i < words.length; i++) {
        if ((line + words[i]).length + 1 > maxWidth) {
            res.push(line);
            line = words[i];
        }
        else
            line += ' ' + words[i];
    }
    res.push(line.padEnd(maxWidth));

    for (let i = 0; i < res.length - 1; i++) {
        const split = res[i].split(' ');
        if (split.length === 1)
            res[i] = split[0].padEnd(maxWidth);
        else {
            let spaces = maxWidth - res[i].length;
            let idx = 0;
            while (spaces > 0) {
                split[idx++] += ' ';
                if (idx === split.length - 1)
                    idx = 0;
                spaces--;
            }
            res[i] = split.join(' ');
        }
    }

    return res;
};

첫번째 for문에서는 maxWidth를 넘지 않도록 단어 + 띄어쓰기 하나로만 문장 생성
마지막 문장은 왼쪽 정렬이기 때문에 미리 padEnd로 공백 채운 문장 넣기
이후 두번째 for문에서 각 문장을 split 해두고
필요한 수의 공백을 앞에서부터 돌아가면서 하나씩 추가
마지막으로 split을 다시 join하여 문장 대체
(split 했을 때 단어가 하나면 왼쪽 정렬해야하기 때문에 padEnd)

📌 결과

Accepted
Runtime 53ms (Beats 45.86%)
Memory 48.63MB (Beats 77.74%)

📚 러닝 포인트

한번에 문장을 만들 수 있는 word를 구하고, 띄어쓰기까지 담으려고 했으나 계산이 복잡해지는 바람에 그 둘을 분리해서 구현하기로 하였다. 특히 띄어쓰기를 분배하는 파트에서 나누기를 해야하나, 그러면 나머지는 어떻게 분배하지 고민이 많던 와중 그냥 반복문을 돌면서 하나씩 추가하는 방법을 보았고, 도움이 굉장히 많이 되었다. 하지만 split을 한번 더 진행하는 것과 워낙에 length 사용이 많아서 효율은 그다지 좋지 못했다. 그래도 hard 문제를 이만큼 접근할 수 있었다는 것에 일단 만족 하는 중... 이제 배열/문자열 문제는 이걸로 끝이 났다. 다음부터는 two pointer 화이팅!

profile
나도 할 수 있을까?

0개의 댓글