CodeIQ MAGAZINECodeIQ MAGAZINE

【息抜き】右位置揃え【言語不問】解答と解説

2017.07.03 Category:CodeIQ問題解説・リーダーボード Tag:

  • 2
  • このエントリーをはてなブックマークに追加

息抜き時間でできる、簡単なプログラム。

あなたは見事、プログラムを書けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【息抜き】右位置揃え【言語不問】

本問題は、表題のテーマで、簡単なプログラムを書くものです。

それでは以下、問題とその解答を見ていきましょう。

問題

改行区切りの文字列の各行は、半角数字のみの整数(最大桁数32)になっています。

この各行の先頭に任意の数の半角のアンダーバー(_)を挿入して、右揃えになるように加工して下さい。

ただし、最も桁数が多い数値の先頭には、半角のアンダーバーを挿入しないものとします。

(参考:各プログラミング言語の標準入出力サンプル

// 入力例
1
23
45678
9
10
// 出力例
____1
___23
45678
____9
___10

答え

この問題は、以下の手順で処理を行なう必要があります。

  1. 各行の文字列長を調べて、最大の文字列長を得る。
  2. 各行の文字列が、最大の文字列長より短ければ、足りない文字数分の「_」を、文字列の先頭に追加する。

初めに全ての行の文字列長を調べなければ、最大の文字列長は分かりません。そのため、2回各行に対して処理を行なう必要があります。

そのことが分かれば、この問題は解けます。

以下、問題の入力と出力です。

入力1

出力1

入力2

出力2

以下、解答例を示します。サンドボックスで実行してください。

// https://codeiq.jp/tools/sandbox/
// Java (7/8)

import java.util.*;

class Main{
    public static void main(String[] args) {
        // 変数の初期化
        Scanner cin = new Scanner(System.in);
        List<String> list = new ArrayList<>();
        String line;
        int lenMax = 0;

        // 最大の文字列長を求める、配列への格納
        for(;cin.hasNext();) {
            line = cin.nextLine();
            if (line.length() > lenMax) lenMax = line.length();
            list.add(line);
        }

        // 先頭に_を追加
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            line = iterator.next();
            int len = lenMax - line.length();
            for (int i = 0; i < len; i ++) {
                line = "_" + line;
            }
            System.out.println(line);
        }
    }
}
// Node.js

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');

    // 最大桁数を決定
    var max = 0;
    lines.forEach(function(line) {
        if (line.length > max) {max = line.length}
    });

    // 右寄せで出力
    lines.forEach(function(line) {
        var s = new Array(max + 1).join('_') + line;
        s = s.substr(- max);
        console.log(s);
    });
});

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

  • 2
  • このエントリーをはてなブックマークに追加

■関連記事

【息抜き】カードを上手く並べよう【言語不問】解答と解説... 【息抜き】カードを上手く並べよう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...
【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...
数学の問題をプログラミングで解こう!「ディバイド・アウト」問題解説... 問題のおさらい 自然数 n と素数 p に対し、n の階乗(n!)を p でこれ以上割り切れなくなるまで繰り返し割り、その商をさらに p で割ったときの余りを F(n, p) と定義します。 例えば F(12, 5)=4 です。 12!(=479001600)は 5 で最大 2 回割ることができ...
【息抜き】ファイル名を作ろう【言語不問】解答と解説... 【息抜き】ファイル名を作ろう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 ファイルをディレクトリ内に作成する際、同じ名前のファイルがあると、末尾に数字を付けるなどして同じ名前にならないようにします。 こうし...
【夏のミステリー】殺人現場のコード 解答と解説... 【夏のミステリー】殺人現場のコード 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 殺人現場にプログラマが倒れていて、途中までプログラムが書かれている。 「続きを書いて欲しい」 これはダイイングメッセージなのか? どう...
数学の問題をプログラミングで解こう!「キャンディ・アンド・チョコレート」問題解説... 問題のおさらい n 個のキャンディをグループに分けます。 グループの最大のキャンディの個数が k 個となるような分け方の数を F(n, k) と定義します。 例えば、F(8, 3)=5 です。このときの分け方を以下に示します。 なお個々のキャンディを区別せずに扱う点に注意してください。 同...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ