見出し画像

[ABC269Python]UNICORNプログラミングコンテスト2022(AtCoder Beginner Contest 269)A~C問題Python解説

2022年9月17日に行われました、Atcoder社主催のABC269の解説記事です。
是非いいね・コメントお願いいたします。

A問題

a, b, c, d = map(int,input().split())
print((a+b)*(c-d))
print("Takahashi")

整数が与えられますので、計算結果と文字列を出力します。
1行目には(a+b)×(c-d)の計算結果を出力します。
2行目には文字列Takahashiを出力します。

B問題

S = [list(input()) for i in range(10)]

for i in range(10):
    for j in range(10):
        if S[i][j] == "#":
            B = i+1
            D = j+1
            
        
for i in range(1, 11):
    for j in range(1, 11):
        if S[-i][-j] == "#":
            A = 11-i
            C = 11-j
            
print(A, B)
print(C, D)

B問題としては少し難しい問題でした。
ただ、10×10のマス目なので、TLEは考えなくてよさそうです。

いろいろな解き方が考えられますので、私のは一例として捉えてくださいね。
問題文がややこしいですが、
要は#で作られる正方形の座標を出力しろという問題でした。

入力例1を例題として扱います。
#で作られる4×4の正方形の座標を求めるわけですが、
正方形が上辺、右辺、下辺、左辺で囲まれているとすると、
Aは上辺のi座標
Bは下辺のi座標
Cは左辺のj座標
Dは右辺のj座標
が当てはまっています。
これを出力すればいいということです。

1つ1つ求めてもいいですが、
正方形の左上の点の座標を求めれば、
AとCが求めることができ、
正方形の右下の点の座標を求めれば、
BとDを求めることができます。

どのように左上と右下の点の座標を求めるかというと、
10×10のマス目の左上から探していき、最後の#の座標が右下の座標
10×10のマス目の右下から探していき
(インデックスを-1から減少させれば探せます)、
最後の#の座標が左上の座標
になります。

最後の出力方法は2段になっているので、注意が必要です。

C問題

from itertools import product

N = int(input())

n = format(N, "b")

lenn = len(n)
lis = [[] for _ in range(lenn)]
# print(n,lenn)
for i in range(lenn):
    if n[i] == "0":
        lis[i] = ["0"]
    else:
        lis[i] = ["0","1"]
# print(lis)

lst = [*map(list, product(*lis))]
# print(lst)
for i in lst:
    i = int("".join(i), 2)
    print(i)

ⅹもNも2進数に直した形で進めていきます。
10進数⇔2進数のやり方は以下を確認してください。

問題分の条件を確認すると、
「xの2^kの位が1ならば、Nの2^kの位は1が成り立つ」
と記載があります。
ここでは数学の考え方を使うのでもしわからなければ、
以下などを確認してください。

上記の条件を言い換えて、
Nは既に与えられているので、
2進数にしたNからxを求めるとすると、
Nは2進数なので、Nのある位は0か1になります。
Nのある位が0だとするとxのある位は0になります。
Nのある位が1だとするとxのある位は0か1になります。

つまり、xの全ての位について、
0と1が考えられる場合と0しか考えられない場合があるという
判断になりますね。

では、スクリプトを書いていきましょう。
まずは、入力されたNを2進数に直します。(これをnとします。)
nの桁数を確認して(lenn)、
nを1桁ずつ確認していきます。
先程も申し上げた通り、
ある桁が0なら["0"]をその桁に代入、
1なら["0","1"]をその桁に代入します。

そして、全ての可能性があるlenn桁の2進数を作成した上で、
最後に10進数に直して出力します。

組み合わせは以下を確認してください。

質問はコメントにてお待ちしています。

この記事が気に入ったらサポートをしてみませんか?