読者です 読者をやめる 読者になる 読者になる

UVa400 Unix ls

問題文
http://uva.onlinejudge.org/external/4/400.html

問題概要
ls コマンドで出力されるような表を実装せよ。ファイル名がある部分だけ、全ての項目を最も長いファイル名 + 2 まで空白で埋める。'-' は丁度60文字である。

解法
行と列のサイズ設定が一番詰みやすいので少し調整とかしてる。あとは項目が無い部分は出力右端の空白をトリムするところとかが問題かも知れない。全く解法の説明になってないが基本やるだけ。

以下、雑なコードかもわからない。

string trim_right(const string& s) {
  int const size = s.size();
  char str[70]; for(int i=0; i<size; i++) str[i] = s[i];
  str[size] = 0;
  for(int i=size-1; i>=0; i--) {
    if(str[i] == ' ') str[i] = 0;
    else break;
  }
  string t = str;
  return t;
}
 
int main() {
  int N;
  while(cin >> N) {
    string arr[110];
    int longest = 0;
    for(int i=0; i<N; i++) {
      cin >> arr[i];
      longest = max(longest, (int)arr[i].size());
    }
    sort(arr, arr+N);
    int const dashsize = 60;
    int const strsize = longest+2;
    int row = dashsize / strsize;
     
    cout << "------------------------------------------------------------" << endl;
     
    if(longest > 58) {
      row = 1;
    }
     
    int const column = ceil((double)N/row);
    string output[110];
     
    for(int i=0; i<row; i++) {
      for(int j=0; j<column; j++) {
        if(i*column+j  >= N) {
          output[j] = trim_right(output[j]);
          continue;
        }
        output[j] += arr[i*column+j];
        for(int k=0; k<strsize - arr[i*column+j].size(); k++) output[j] += ' ';
      }
    }
     
    for(int i=0; i<column; i++) {
      cout << output[i] << endl;
    }
  }
  return 0;
}