AtCoder Beginner Contest 098 B問題
競技プログラミングで使える関数を実際の問題を通して紹介いたします。
今回は「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言語の基本から仕事のやり方まで
- 作者: コーリー・アルソフ,清水川貴之監訳,清水川貴之,新木雅也
- 出版社/メーカー: 日経BP社
- 発売日: 2018/02/24
- メディア: 単行本
- この商品を含むブログ (2件) を見る