{ }codelper
桁そろえ文字列の長さP0029

名前を右寄せする

一行目に名前の数 n、続く n 行に英語の名前が一つずつ与えられる。
いちばん長い名前の長さを幅として、すべての名前をその幅に右寄せし、入力の順に一行ずつ出力せよ。
右寄せとは、名前の前(左)に空白を付けて長さを幅と同じにすることである。
いちばん長い名前は空白なしでそのまま出る。

入力
1 ≤ n ≤ 100。
名前は英大文字・小文字のみ、長さ 1〜20
出力
n 行、各行は前に空白を付けて幅にそろえた名前
例 1 · stdin
3
Ann
Maximilian
Jo
stdout
       Ann
Maximilian
        Jo
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

左に空白を埋める関数:Python s.rjust(w)、JS・TS s.padStart(w)、C# s.PadLeft(w)、Java String.format("%" + w + "s", s)、C printf("%*s", w, s)(幅を引数で渡します)、C++ std::setw(w)。
Craykon s.前埋め(w)(C# の PadLeft と同じ。
"7".前埋め(3, "0") なら 007)。
名前が左に寄る側は Python ljust、C %-*s のように名前が似ていて取り違えやすいです。
落とし穴:幅はすべての名前を読み終えてからでないと分かりません。
読みながらすぐ出力すると、その時点までの最大幅でそろえてしまい、幅を最大の長さ 20 に固定しても間違いです。

Pythonmain.py · 5 行
n = int(input())names = [input().strip() for _ in range(n)]width = max(len(name) for name in names)for name in names:    print(name.rjust(width))
JavaScriptmain.js · 4 行
const [first, ...rest] = require("fs").readFileSync(0, "utf8").split("\n");const names = rest.slice(0, Number(first)).map((s) => s.trim());const width = Math.max(...names.map((s) => s.length));console.log(names.map((s) => s.padStart(width)).join("\n"));
TypeScriptmain.ts · 5 行
import { readFileSync } from "node:fs";const [first, ...rest]: string[] = readFileSync(0, "utf8").split("\n");const names: string[] = rest.slice(0, Number(first)).map((s) => s.trim());const width: number = Math.max(...names.map((s) => s.length));console.log(names.map((s) => s.padStart(width)).join("\n"));
JavaMain.java · 18 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(br.readLine().trim());        String[] names = new String[n];        int width = 0;        for (int i = 0; i < n; i++) {            names[i] = br.readLine().trim();            width = Math.max(width, names[i].length());        }        StringBuilder out = new StringBuilder();        for (String name : names) out.append(String.format("%" + width + "s", name)).append('\n');        System.out.print(out);    }}
C#Main.cs · 14 行
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        string[] names = new string[n];        for (int i = 0; i < n; i++) names[i] = Console.ReadLine().Trim();        int width = names.Max(s => s.Length);        foreach (string name in names) Console.WriteLine(name.PadLeft(width));    }}
C++main.cpp · 17 行
#include <algorithm>#include <iomanip>#include <iostream>#include <string>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<std::string> names(n);    size_t width = 0;    for (auto& name : names) {        std::cin >> name;        width = std::max(width, name.size());    }    for (const auto& name : names) std::cout << std::setw(static_cast<int>(width)) << name << "\n";}
Cmain.c · 15 行
#include <stdio.h>#include <string.h> int main(void) {    int n, width = 0;    char names[100][21];    if (scanf("%d", &n) != 1) return 0;    for (int i = 0; i < n; i++) {        scanf("%20s", names[i]);        int len = (int)strlen(names[i]);        if (len > width) width = len;    }    for (int i = 0; i < n; i++) printf("%*s\n", width, names[i]);    return 0;}
Craykonmain.cray · 13 行
n = コンソール.行読み().数に();names = [];width = 0;繰り返す (i = 0; i < n; i++){    name = コンソール.行読み().空白除去();    names.追加(name);    width = 数学.大きい方(width, name.長さ);}それぞれ (name の中 names){    コンソール.書く(name.前埋め(width));}