週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

bool型(AtCoder(競プロ)1日1問【3日目】【Python】)


AtCoder Beginner Contest 098 B問題

abc098.contest.atcoder.jp

競技プログラミングで使える関数を実際の問題を通して紹介いたします。

今回は「bool()」です。

 

bool型

bool(引数)の引数部に条件を書き、それがTrueであれば"1"、Falseであれば"0"となります。以下のコードではそれを利用しています。

 

英小文字からなる文字列S。
この文字列の一箇所を切断して文字列XとYに分ける。
この時「XとYの両方に含まれる文字の種類」の最大化を行います。
この時の両方に含まれる文字の種類数の最大値を求めます。

#N:文字列の長さ
#S:英小文字
N = int(input())
S = input()

#分割する場所、両方に含まれる種類数の最大値
posDevide = 1
maxMatchWordNum = 0

#N - 1まで分割できる
while posDevide <=  N - 1:

        arrayNum = 0
        matchWordNum = 0

        while arrayNum < posDevide:

#X側の文字の中とY側の文字の中の照合をする上で、
#X側の中にある同じ文字についての照合をしないために

                if arrayNum  == S.find( S[ arrayNum ], 0, posDevide):
#同じ文字があれば「matchWordNum:一致した語の数」を+1
                        matchWordNum = matchWordNum + 1 if  bool( S.count( S[ arrayNum ], posDevide, N )) else matchWordNum
                arrayNum += 1
#一致した語の数の最大値
        maxMatchWordNum = matchWordNum if matchWordNum > maxMatchWordNum else maxMatchWordNum
#区切るポイントを一つずらす
        posDevide += 1

print(maxMatchWordNum)

 

コードの改善

競技プログラミングではプログラムの処理完了までの速度も重要な要素の一つですので、より短く簡潔なコードを書くことが重要です。

n=int(input());s=input();print(max(len(set(s[:i])&set(s[i:]))for i in range(n)))

 

別例:

def main():
    N = int(input())
    S = input()
 
    ans = 0
    for i in range(N):
        s = set(S[:i]) & set(S[i:])
        ans = max(ans, len(s))
    print(ans)

if __name__ == '__main__':
    main()

 

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで