Python3で挑むにあたり忘れないようにメモ書きを残しておく
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
を類題も含めてといた記録のメモ
標準入力例
# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print("{} {}".format(a+b+c, s))
練習1
問題
すぬけ君は1,2,3の番号がついた
3つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス iには siが書かれています。
すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。
解答
今回の標準入力の入力例は101
だったので一文字ずつ区切るようにした
#一文字ずつ区切る
chars = list(input())
#文字列で入っているぽい['1', '0', '1']
#文字列1とあっている配列の数をとりだしている
print(chars.count('1'))
練習2
問題
ラーメン店「高橋屋」のラーメンの値段は
1杯 700円ですが、トッピング(味玉、チャーシュー、ねぎ)を乗せた場合は 1種類につき
100円が加算されます。
ある客がラーメンを一杯注文し、店員にトッピングの希望を伝えました。店員は注文の内容をメモ帳に文字列 Sとして記録しました。
Sの長さは3文字で、Sの 1文字目が o のとき客のラーメンに味玉を乗せることを、x のとき味玉を乗せないことを表します。同様に、
Sの2文字目、3文字目はそれぞれチャーシュー、ねぎの有無を表します。
Sが入力されると、対応するラーメンの値段を出力するプログラムを書いてください。
解答
#一文字ずつ区切る
chars = list(input())
#文字列で入っているぽい['o', 'x', 'o']
#文字列1とあっている配列の数をとりだしている
print(700+chars.count('o')*100)
練習3
問題
2018年 1月某日、高木さんは書類を書いています。書類には、その日の日付を yyyy/mm/dd という形式で書き込む欄があります。例えば、2018年 1月23日は 2018/01/23 となります。
書類を書き終えたあと、高木さんは日付欄の先頭に誤って 2017 と書いてしまっていたことに気がつきました。高木さんが日付欄に書いた文字列 Sを入力すると、Sの先頭の
4文字を 2018 に修正して出力するプログラムを書いてください。
解答
#一文字ずつ区切る
chars = list(input())
#文字列で入っているぽい[2017/01/07]
#['2', '0', '1', '7', '/', '0', '1', '/', '0', '7']
# 文字を入れ替える
chars[3]="8"
# 文字を出力する
for s in chars:
# スペーサーをなしに設定
print(s, end ="")
#2018/01/07出力させる
参考文献
pythonでリストを普通の文字列に直す時どうしようかなとおもった
https://teratail.com/questions/135327
練習4
問題
internationalization という英単語は、i18n と略されることがあります。 これは、先頭文字 i と末尾文字 n の間に 18文字が挟まっていることに由来します。
長さ 3以上の英小文字のみからなる文字列
sが与えられます。 同様の規則によって sを略してください。
解答
#一文字ずつ区切る
chars = list(input())
#文字列で入っているぽい[internationalization]
#len(chars)で文字の長さを数える
#最初の文字と真ん中の数と最後の文字を出力させる
#strでInt型をStringに変換する
print(chars[0]+str(len(chars)-2)+chars[len(chars)-1])
練習5
問題
英小文字のみからなる文字列 s, tが与えられます。 あなたは、
sの文字を好きな順に並べ替え、文字列 s′を作ります。 また、
tの文字を好きな順に並べ替え、文字列
t′を作ります。 このとき、辞書順で
s′<t′となるようにできるか判定してください。
解答(自力で解けなかった)
#数を数える
count = 0
#一文字ずつ区切る
chars1 = list(input())
chars2 = list(input())
#短いやつをソートする
if len(chars1) < len(chars2):
print("len(chars1) < len(chars2)")
#辞書順にソートする
#print(sorted(chars1))
# ソートしたやつを短い方と一文字ずつ比較する
for sorted_char1 in sorted(chars1):
#print(sorted_char1)
# chars1にまわしている文字よりも辞書順逆に回す
for reversed_chars2 in reversed(chars2):
#もし逆の辞書で回したのと比較して小さければ
if sorted_char1 <= reversed_chars2:
#回数を数える
count = count+1
#その数と短いの方の長さを比較して、すべて比較していたら
if count == len(chars1):
#Yesを表示
print("Yes")
#おわりはsorted_char1 <= reversed_chars2にならなかったやつと、長いやつを比較する
if count != len(chars2):
print("No")
#len(chars1) < len(chars2)ではなかった場合
else:
print("len(chars1) > len(chars2)")
#辞書順にソートする
# ソートしたやつを短い方と一文字ずつ比較する
for sorted_char2 in sorted(chars2):
# chars2にまわしている文字よりも辞書順逆に回す
for reversed_chars1 in reversed(chars1):
#もし逆の辞書で回したのと比較して小さければ
print("テスト")
print(sorted_char2)
print(reversed_chars1)
if sorted_char2 <= reversed_chars1:
#回数を数える
count = count+1
print("回数を数える")
print(count)
print(len(chars2))
#その数と短いの方の長さを比較して、すべて比較していたら
if count == len(chars2):
#Yesを表示
print("Yes")
#おわりはsorted_char1 <= reversed_chars2にならなかったやつと、長いやつを比較する
if count != len(chars1):
print("No")
回答例
s = input()
s_asc = ''.join(sorted(s))
t = input()
t_desc = ''.join(sorted(t, reverse=True))
if s_asc < t_desc:
print('Yes')
else:
print('No')
課題
なぜできなかったのか
- 難しく考えすぎてしまった
- join関数を知らなかった
- たったの一行で連結させることが可能
- join関数は、”.join(リスト名)で使える。
- しかもソートさせたやつを入れるだけでいい
できていたこと
- 文字列の長さで分岐させるを考えられたのは良かった