Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 동일한 길이의 줄로 변환하여 단어 집합을 정당화하는 프로그램

<시간/>

단어 목록과 너비가 k라고 가정하고 각 행에 정확히 k개의 문자가 있고 텍스트가 완전히 정렬되도록 텍스트를 정렬해야 합니다. 여기서 우리는 각 줄에 삽입할 수 있는 만큼 단어를 포장할 것입니다. 그리고 필요한 경우 각 행에 정확히 k개의 문자가 있도록 추가 공백 ' '을 채울 것입니다.

여기에서 단어 사이의 추가 공백은 가능한 한 균등하게 분배되어야 합니다. 줄의 공백 수가 단어 사이에 균등하게 분할되지 않으면 왼쪽의 빈 슬롯이 오른쪽의 슬롯보다 더 많은 공백이 할당됩니다. 텍스트의 마지막 줄은 왼쪽 정렬되어야 하며 단어 사이에 추가 공백이 삽입되지 않아야 합니다.

따라서 입력이 ["The", "grumpy", "wizards", "make", "toxic", "brew", "for", "the", "evil", "queen", "and" , "잭"] 및 k =13

그러면 출력은 -

가 됩니다.
The grumpy
wizards make
toxic brew
for the evil
queen and
Jack

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 결과라는 배열 하나 만들기
  • 범위 0에서 a의 크기까지 i에 대해 j
      만큼 i 업데이트
    • 너비:=0
    • i 범위의 j에 대한 크기 및 너비 + 크기[j] + j – i <=b,
      • 너비 :=너비 + [j]의 크기
    • 공백 :=1, 추가 :=0
    • j – 1 !=1이고 j !=a의 크기이면
      • 공백 :=(b - 너비) / j – i – 1
      • extra :=(b - 너비) 모드(j – i – 1)
    • 줄 :=a[i]
    • i + 1에서 j까지 범위의 k에 대해
      • 공백의 공백 수를 줄로 연결
      • extra> 0이면 공백을 줄로 연결
      • 추가로 1 감소
      • line :=줄과 [k] 연결
    • x :=줄의 크기
    • line :=(b - x) 공백 수를 줄로 연결
    • 결과에 줄 삽입
  • 반환 결과

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<string> fullJustify(vector<string> &a, int b) {
      vector <string> result;
      int i, j;
      for(i = 0; i < a.size(); i = j){
         int width = 0;
         for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){
            width += a[j].size();
         }
         int space = 1;
         int extra = 0;
         if(j - i != 1 && j != a.size()){
            space = (b - width) / (j - i - 1);
            extra = (b - width) % (j - i - 1);
         }
         string line(a[i]);
         for(int k = i + 1; k < j; k++){
            line += string(space, ' ');
            if(extra-- > 0){
               line += " ";
            }
            line += a[k];
         }
         int x = line.size();
         line += string(b - x, ' ');
         result.push_back(line);
      }
      return result;
   }
};
main(){
   vector<string> v = {"The", "grumpy", "wizards", "make", "toxic", "brew", "for", "the", "evil", "queen", "and", "Jack"};
   Solution ob;
   print_vector(ob.fullJustify(v, 13));
}

입력

["I", "love", "coding.", "here", "we", "will", "write", "some", "program"]
16

출력

[The grumpy,
wizards make,
toxic brew,
for the evil,
queen and,
Jack ,]