단어가 들어있는 문자열 배열 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 화이팅!