A問題 暗証番号
1 2 3 4 5 |
n = input() if n[0]==n[1]==n[2]==n[3]: print('SAME') else: print('DIFFERENT') |
C問題 数式の書き換え
方針
次の条件を満たす数式があります。
- 演算子は
+
(加算) と*
(乗算) のみからなる。乗算を優先して計算する。 - 括弧は存在しない。
- それぞれの項は、 1 桁の整数である
数式の計算結果を0にするために、最低で何回書き換えが必要かを調べる問題です。
入力例2を見てみます。→ 3*1+1*2
計算結果を0にするためには3,1のどちらかと、1,2のどちらかを0に書き換えれば良いので答えは2になります。
次の数式を見てみます。→1+0+3+4
計算結果を0にするためには1,3,4を0に書き換えれば良いので答えは3になります。
以上を踏まえて、+を境目にして項を分けて、各項の計算結果を0にするために書き換えれば良い回数を数えることにしました。
*が含まれる項はいくら数字があったとしても、どれか1つだけでも0があれば良いです。
3*1+1*2→[3*1, 1*2]
1+0+3+4→[1, 0, 3, 4]
1*2*3*4*5+2+3→[1*2*3*4*5, 2 ,3]
解答①
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
s = input() list = [] count=0 #スライス用のカウント # + を境目にして項を分ける→[x*x*x,y,z*z・・・] for i in range(len(s)): if s[i]=='+': list.append(s[count:i]) #スライスを使って 各+までの文字列をlistに格納 count=i+1 # 1を加えないと、次の項で+が含まれてしまう→[x*x*x,+y,+z*z・・・] list.append(s[count:]) #最後の項をlistに格納 ans = 0 #[x*x*x,y,z*z・・・]の各要素の計算結果が0でなければ1を加える for j in range(len(list)): if len(list[j])==1 and list[j]!='0': #要素の長さが1 かつ 値が0以外の場合 ans +=1 elif len(list[j])>1: #要素の長さが2以上の場合 _ = 1 #計算結果を1に初期化 for k in range(0,len(list[j]),2): #要素数、被演算子は必ず偶数なのでステップは2 →x*x*x , z*z _ *= int(list[j][k]) #掛算の計算 if _ != 0: #計算結果が0でない場合 ans+=1 print(ans) |
解答②
なんと1行だけで正解している解答がありました。
入力時にsplit関数で+を指定して分割して、0を含まない項の数を数えると一発で正解でした。
コメント