CodeIQ MAGAZINECodeIQ MAGAZINE

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

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

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

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

あなたは見事、プログラムを書けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
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
  • このエントリーをはてなブックマークに追加

■関連記事

【夏のミステリー】殺人現場のコード 解答と解説... 【夏のミステリー】殺人現場のコード 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 殺人現場にプログラマが倒れていて、途中までプログラムが書かれている。 「続きを書いて欲しい」 これはダイイングメッセージなのか? どう...
数学の問題をプログラミングで解こう!「キャンディ・アンド・チョコレート」問題解説... 問題のおさらい n 個のキャンディをグループに分けます。 グループの最大のキャンディの個数が k 個となるような分け方の数を F(n, k) と定義します。 例えば、F(8, 3)=5 です。このときの分け方を以下に示します。 なお個々のキャンディを区別せずに扱う点に注意してください。 同...
【夏のミステリー】時間制限の密室 解答と解説... 【夏のミステリー】時間制限の密室 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 (なんやかんやあって)命からがら逃げてきた、あなた。 しかし逃げ込んだ部屋にあなたが入った途端、自動でドアはロックされ、しかも10分後にはガ...
数学の問題をプログラミングで解こう!「ウッド・キーパー」問題解説... 問題のおさらい n 本の丸太があります。これらの向きと端をそろえ、地面に積みます。 積む際には次のルールに従います。 地面には好きな本数の丸太を置けます。隣り合う丸太は接して置きます。 左右に隣り合う 2 本の丸太の上に、新たな丸太を 1 本置けます。 全ての丸太は一...
【息抜き】平均値と中央値【言語不問】解答と解説... 【息抜き】平均値と中央値【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 改行区切りの文字列の各行(最大行数30)は、半角数字のみの整数(最大桁数8)になっています。 この各行の平均値と中央値を求めて下さい。小...
【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】解答と解説... 【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 ...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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