AIZU ONLINE JUDGE ITP1_5_Bをpythonで解いてみた

python

本サイトAIZU ONLINE JUDGE ITP1_5_B へはこちらから

目次

問題:フレームの描画

以下のような、たてH cm よこ W cm の枠を描くプログラムを作成して下さい。

##########
#........#
#........#
#........#
#........#
##########

上図は、たて 6 cm よこ 10 cm の枠を表しています。

Input

入力は複数のデータセットから構成されています。各データセットの形式は以下の通りです:

H W

H, W がともに 0 のとき、入力の終わりとします。

Output

各データセットについて、たて H cm よこ W cm の枠を出力して下さい。

各データセットの後に、1つの空行を入れて下さい。

Constraints

  • 3 ≤ H ≤ 300
  • 3 ≤ W ≤ 300

Sample Input

3 4
5 6
3 3
0 0

Sample Output


####
#..#
####

######
#....#
#....#
#....#
######

###
#.#
###

解答例

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        for k in range(W):
            if i == 0 or i == H-1 or k == 0 or k == W-1:
                print("#", end="")
            else:
                print(".", end="")
        print()
    print()

解説

以下のように解いていきます。

  1. while文を使用し、入力処理を行う
  2. 長方形(フレーム)の描画

ある条件まで入力を続ける場合はwhile文とif文を組み合わせて、入力処理を行います。

# if文の条件式に当てはまるまでループ処理を続ける
while True:
    処理
    # この条件式に当てはまる場合、break文でループ処理を終了する
    if 条件式:
        break

今回は、whileループ内でmap関数でH、Wに2つの整数を設定し、H と W がともに 0の場合にbreak文で処理を終了します。

# 終了条件に当てはまるまで処理を続ける
while True:
    # input().split()で複数個の文字列を取得 → int関数に当てはめint型に変換 → H, Wに設定
    H, W = map(int, input().split())
    # H と W がともに0の場合にbreak文で処理を終了
    if H == 0 and W == 0:
        break

※サイト内「AIZU ONLINE JUDGE ITP1_1_Cをpythonで解いてみた」の、map関数とはにmap関数の使用方法が書かれておりますのでぜひご覧ください。

今回はfor文を2つ使用します。

内側のfor文”for k in range(W):”で横の描画、外側のfor文”for i in range(H):”で縦の描画を行います。

たての描画をする際に、以下の条件に当てはまるときに、枠と判断し、”#”を描画、それ以外を”.”で描画します。

  • range(H)で0~H-1までの値を取り出す際の0は上の枠
  • range(H)で0~H-1までの値を取り出す際のH-1は下の枠
  • range(W)で0~W-1までの値を取り出す際の0は左の枠
  • range(W)で0~W-1までの値を取り出す際のW-1は右の枠

なぜH-1やW-1なのかというと、range関数は0から引数に設定された値−1まで取り出す関数だからです。
例えば、range(5)は0~4までの5つの数字を取り出すので最初の値は0、最後の値は4となります。

print関数の引数のendに””を設定すると、連続で描画されます。
※デフォルトでは改行コードが指定され、全て改行して表示されてしまいます。

while True:
    H, W = map(int, input().split())
    if H == 0 and W == 0:
        break
    for i in range(H):
        for k in range(W):
            if i == 0 or i == H-1 or k == 0 or k == W-1:
                # 枠のときだけ"#"を表示、end=""で連続で表示されるようにする
                print("#", end="")
            else:
                # 枠以外は"."を表示、end=""で連続で表示されるようにする
                print(".", end="")
        # 横の行の区切るために、空のprint関数を記述
        print()
    # 各データセットの後に、1つの空行を入れてるため空のprint関数を記述
    print()

※サイト内「AIZU ONLINE JUDGE ITP1_3_Bをpythonで解いてみた」の、range関数とはにrange関数の使用方法が書かれておりますのでぜひご覧ください。

※サイト内の「AIZU ONLINE JUDGE ITP1_1_Aをpythonで解いてみた」の、print関数とはにprint関数の使用方法が書かれておりますのでよかったらご覧ください。

最後に、もう一度プログラムを確認してみましょう。

# 終了条件に当てはまるまで処理を続ける
while True:
    # input().split()で複数個の文字列を取得 → int関数に当てはめint型に変換 → H, Wに設定
    H, W = map(int, input().split())
    # H と W がともに0の場合にbreak文で処理を終了
    if H == 0 and W == 0:
        break
    for i in range(H):
        for k in range(W):
            if i == 0 or i == H-1 or k == 0 or k == W-1:
                # 枠のときだけ"#"を表示、end=""で連続で表示されるようにする
                print("#", end="")
            else:
                # 枠以外は"."を表示、end=""で連続で表示されるようにする
                print(".", end="")
        # 横の行の区切るために、空のprint関数を記述
        print()
    # 各データセットの後に、1つの空行を入れてるため空のprint関数を記述
    print()
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

コメント

コメントする

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約が適用されます。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次