https://leetcode.com/problems/text-justification/
단어 배열과 줄별 최대 길이가 주어질 때 다음의 조건 만족시키도록 구현
1. 한 줄 당 최대 길이 내에 단어 수를 최대한 많이 넣는다.
2. 단어 사이에는 동일한 값의 padding(blank)를 준다. (이때, padding 개수가 홀수면 왼쪽 단어 부터 패딩 값을 더 늘려준다.)
3. 마지막 줄은 왼쪽 정렬 시킨다. (즉, padding을 다 오른쪽에 준다.)
public class Solution {
public IList<string> FullJustify(string[] words, int maxWidth) {
string currentWord = words[0];
int stringLength = currentWord.Length;
int wordCount = 1;
int blankCount = 0;
int blankCountPerWord = 0;
int remains = 0;
string blank = "";
List<string> currentStringList = new List<string>() {currentWord};
List<string> answerList = new List<string>();
for (int i = 1; i < words.Length; i++)
{
currentWord = words[i];
if (stringLength + currentWord.Length + wordCount + 1 > maxWidth + 1) // +1은 맨 뒤 단어 count도 세져서 빈칸 하나 있다고 처리되기때문
{
if (wordCount <= 1)
{
answerList.Add(currentStringList[0] + "".PadRight(maxWidth - currentStringList[0].Length));
}
else
{
StringBuilder currentLineSb = new StringBuilder();
// blank 개수 계산
blankCount = maxWidth - stringLength;
blankCountPerWord = blankCount / (wordCount - 1);
remains = blankCount % (wordCount - 1);
blank = "".PadRight(blankCountPerWord);
if (remains == 0)
{
for(int j = 0; j < wordCount - 1; j++)
{
currentLineSb.Append(currentStringList[j]);
currentLineSb.Append(blank);
}
currentLineSb.Append(currentStringList[wordCount - 1]);
}
else
{
for(int j = 0; j < wordCount - 1; j++)
{
currentLineSb.Append(currentStringList[j]);
currentLineSb.Append(blank);
if (remains > 0)
{
currentLineSb.Append(" ");
remains--;
}
}
currentLineSb.Append(currentStringList[wordCount - 1]);
}
answerList.Add(currentLineSb.ToString());
}
wordCount = 1;
stringLength = currentWord.Length;
currentStringList.Clear();
currentStringList.Add(currentWord);
continue;
}
wordCount++;
stringLength += currentWord.Length;
currentStringList.Add(currentWord);
}
string lastLine = "";
for(int i = 0; i < wordCount - 1; i++)
{
lastLine += currentStringList[i];
lastLine += " ";
}
lastLine += currentStringList[wordCount - 1];
lastLine += "".PadRight(maxWidth - wordCount + 1 - stringLength);
answerList.Add(lastLine);
return answerList;
}
}