トップページ -> AOJの解答例 -> ITP1_9の解答例

ITP1_9の解答例(Python)

8に続いて今回も文字列の扱いについての問題です.

ITP1_9_A: Finding a Word

文章の中から与えられた単語を探し出す問題です. 完全一致のものを探さなければいけないのでリストにしてから判定しています. (strのままだと "aaaaa" の中に"a"が5個あることになってしまう)

# ITP1_9_A
S = ""
W = input()
while True:
    s = input()
    if s == "END_OF_TEXT":
        break
    # 行の最後にスペースを入れないと次の行とつながる
    S += s + " "
    
# 小文字にしてから判定する
S = S.lower()
S_list = S.split(" ")
# 完全一致を探したいのでSのままcountはできない
print(S_list.count(W))

ITP1_9_B: Shuffle

指定回数だけ単語をシャッフルする問題です. 文字列のスライスを使っています.

# ITP1_9_B
while True:
    s = input()
    # 終了条件
    if s == "-":
        break
    n = int(input())
    for _ in range(n):
        h = int(input())
        s = s[h:] + s[:h]
    print(s)
あまり嬉しくはないですが,最後にまとめて1回だけスライスでシャッフルすることもできます.

# ITP1_9_B
while True:
    s = input()
    # 終了条件
    if s == "-":
        break
    n = int(input())
    H = 0
    for _ in range(n):
        H += int(input())
        
    h = H%(len(s))
    print(s[h:]+s[:h])
        

ITP1_9_C: Card Game

与えられた単語のどちらが辞書順で遅いかを判定する問題です. 遅いほうが勝ちです.

# ITP1_9_C
n = int(input())
taro = 0
hanako = 0
for _ in range(n):
    s1,s2 = input().split(" ")
    s1 = s1.lower()
    s2 = s2.lower()
    done = False
    for i in range(min(len(s1),len(s2))):
        if ord(s1[i]) < ord(s2[i]):
            hanako += 3
            done = True
            break
        elif ord(s1[i]) > ord(s2[i]):
            taro += 3
            done = True
            break
    
    # 既に決着がついている場合はこれ以降の判定はしない
    if done:
        continue
            
    # 最後の文字まで同じだった場合は文字数
    if len(s1) < len(s2):
        hanako += 3
    elif len(s1) > len(s2):
        taro += 3
    else:
        taro += 1
        hanako += 1
        
print(taro,hanako)

ITP1_9_D: Transformation

命令に応じて文字列に対して処理を行う問題です. reversed()で得られるのはイテレータであるため一度リストにしてから文字列に直しています.

# ITP1_9_D
S = input()
n = int(input())
for _ in range(n):
    command = input().split(" ")
    opp = command[0]
    a = int(command[1])
    b = int(command[2])+1
    if opp == "print":
        print(S[a:b])
    elif opp == "reverse":
        S = S[:a] + "".join(list(reversed(S[a:b]))) + S[b:]
    elif opp == "replace":
        p = command[3]
        S = S[:a] + p + S[b:]
このやり方が思いつかなくても,ループを使って下のように書いても逆順にすることができます.

def str_reverse(S):
    new_S = ""
    for i in range(len(S)):
        new_S += S[len(S)-i-1]
        
    return new_S
        

<- 前へ戻る 【目次に戻る】 次へ進む ->