<Hard> Text Justification (LeetCode : C#)

이도희·2023년 3월 29일
0

알고리즘 문제 풀이

목록 보기
46/185

https://leetcode.com/problems/text-justification/

📕 문제 설명

단어 배열과 줄별 최대 길이가 주어질 때 다음의 조건 만족시키도록 구현
1. 한 줄 당 최대 길이 내에 단어 수를 최대한 많이 넣는다.
2. 단어 사이에는 동일한 값의 padding(blank)를 준다. (이때, padding 개수가 홀수면 왼쪽 단어 부터 패딩 값을 더 늘려준다.)
3. 마지막 줄은 왼쪽 정렬 시킨다. (즉, padding을 다 오른쪽에 준다.)

  • Input
    단어 배열, 최대 길이
  • Output
    변환된 단어 리스트

예제

풀이

  1. 단어를 하나씩 넣어보며 maxWidth를 넘기는지 판단 (이때 여태까지의 단어 길이 + 현재 추가할 단어 길이 + 여태까지 단어 개수 + 추가할 단어 (1)을 계산 -> 단어 개수는 단어들 사이 빈칸 필요하기 때문)
  2. 넘기면 현재 추가한 단어 빼고 기존에 있던 단어들을 가지고 빈칸 개수 계산 (빈칸 개수는 maxWidth - 현재 단어들의 길이)
  3. 빈칸 개수를 기반으로 나눠 가져야할 padding 계산 (빈칸 개수 / 단어 개수 - 1). 여기서 -1은 마지막 단어는 뒤에 공백 없어서 제외하고 계산하기 때문
  4. 여기서 나누어 떨어지면 그대로 나눠가지고 나누어 떨어지지 않으면 제일 앞에 빈칸 하나씩 추가해주면서 나머지 0 될 때까지 진행
  5. 맨 마지막 라인은 한 칸씩만 띄우고 공백 뒤로 몰기
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;
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글