私の記録ブログ

趣味の記録

Tenka1 Programmer Beginner Contest 2019 を解いてみた(python3)

-A. [AC] On the Way

問題ページ【A - On the Way

私のコンテスト中の解法(解説も同じような解法)

# -*- coding: utf-8 -*-
a,b,c = map(int,input().split() )

if a<c<b or b<c<a:
    print('Yes')
else:
    print('No')

実行時間:17 ms メモリ:2940 KB

-B. [AC] *e**** ********e* *e****e* ****e**

問題ページ【B - *e**** ********e* *e****e* ****e**

私のコンテスト中の解法(解説も同じような解法)

# -*- coding: utf-8 -*-

n = int(input())
s = list(input())
k = int(input())

c = s[k-1]

for i in range(n):
    if s[i] != c:
        s[i] = '*'

# 文字列に直す
ans = "".join(s)
print(ans)

実行時間:17 ms メモリ:3060 KB

K番目の文字を[k-1]で取得して、cに代入。
文字列Sを全部調べて、cと同じ時 '*' と置き換える。
最後にlistからstringに直して出力。

-C. Stones

問題ページ【C - Stones

解説を参考に解いたが
解き方が合っているは分からない

#    サンプル1 # . #

この問題の場合、色を変更し終わったあと
次のうちどれかになる

#    # # # (すべて黒)
#    . # # (途中で白から黒に変わる)
#    . . # (途中で白から黒に変わる)
#    . . . (すべて白)

どのときに一番変更が少なくなるのかを探す。
# -*- coding: utf-8 -*-
n = int(input())
s = list(input())

# 黒の累積和
sum_b = [0]*(n+1)

# 白の累積和
sum_w = [0]*(n+1)

# 例えば
#  # . # (問題)
# 0 1 1 2 (黒の累積和)
# 0 0 1 1 (白の累積和)

for i in range(n):
    if s[i] == '#':
        sum_b[i+1] = sum_b[i] + 1
    else:
        sum_b[i+1] = sum_b[i]

    if s[i] == '.':
        sum_w[i+1] = sum_w[i] + 1
    else:
        sum_w[i+1] = sum_w[i]

ans = n
for i in range(n+1):
    # 0番目からi番目までの黒の数
    black = sum_b[i]
    #  i+1番目からn番目(最後)までの白の数
    white = sum_w[n]-sum_w[i]

    ans = min(ans, black + white)
print(ans)

実行時間:233 ms メモリ:14148 KB

白と黒の累積和を別々に求めた。
最後のforループで、どこが白と黒の境目になったときに変更する文字が少なくなるかを探している。

-D. Three Colors

問題ページ【D - Three Colors

今度やります。TT