No.646 逆ピラミッド

はじめに

競技プログラミングyukicoder
No.646 逆ピラミッド
言語はC#
何かあればTwitter→@pirorirori_n712まで

問題

与えられた整数Nで、Nの数字で構成されたN段の逆ピラミッドを作成する。
入力:整数N(1≤N≤100)
出力:Nの数字で構成されたN段の逆ピラミッド

解き方

ピラミッドは縦と横に広がるものなので、
ループを二重(縦用、横用)にして縦と横を出力していく

例えばNが5だとすると
縦の5つの枠を用意するループ(青字)が一つ
そして、それぞれの縦の中に
横の列を出力するループ(赤字)を入れる

55555
5555
555
55
5

縦のグループは5つ存在するので
for(int i=0;i<5;++i){}
となる。
横のグループは、下に下がるごとに数が1ずつ減っていく(5,4,3,2,1)ので
for(int j=0;j</*ここを段が変わるごとに1減らしていきたい*/;++i){}
イメージとしては上のようになる。

ここでj</*ここを段が変わるごとに1減らしていきたい*/;を考えていく。
「段が変わるごとに」ということは「縦のグループが1増えるごとに」ということだと言える。
そのため、縦の列の増加を横の数の変動に利用すれば
j</*ここを段が変わるごとに1減らしていきたい*/;を実現することができる。

for(int i=0;i<5;++i){}なので
縦の列が1増えるごとにiの値は1,2,3,4,5と増加していく。
これに対して横の列は5,4,3,2,1と減少させていきたい。

ここで縦の列を出力しているiの意味を考えると
iは単に縦の列を5つ出力するだけのものであることが分かる。
つまり、iが増加していくことに意味はなく縦の列が5つできさえすればよい。
横の列が縦の列が増えていくごとに減少して出力したいのならば、
縦の列を数えているiを減少させれば、その値をそのまま横の列の出力に使うことができる。

こう考えていくと
縦の列を作るループ
for(int i=0;i<5;--i){}
横の列を作るループ
for(int j=0;j<i;++j){}
とすれば
縦の列は5,4,3,2,1となり、5つ横の列を入れるための箱を作ることができ
横の列は「j<i;」なのでこちらも各列の上限が5,4,3,2,1となり
期待通りの出力をすることができる。
以上をコードにすると以下のようになる。

コード例

using System;

class No646{
    static void Main(){
        var num=Int32.Parse(Console.ReadLine());
        for(int i=num;i>0;--i){
            for(int j=0;j<i;++j){
                Console.Write(num);
            }
            Console.WriteLine();
        }
    }
}