典型90【027 – Sign Up Requests (★2)】をpython解説

Python

AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画として、「典型90」があります。

今回は、その内、の27問目である「027 – Sign Up Requests (★2)」を解説していきたいと思います。
なにか、間違っているところなどありましたら、@EitaSugiまで、ご指導ご鞭撻の程、よろしくお願い致します!

問題名 【027 – Sign Up Requests (★2)】

027 – Sign Up Requests (★2)

考察

i日目現在、入力されたusernameが既存のusernameに含まれているかどうかを判別する必要があります。

しかし、毎回listの中に含まれているか判別すると、計算量がはO(N・N!)かかってしまいます。

Question ではどうするか?

これに関して、大事なのは既存のusernameには、順番や重複の情報を保つ必要がないということです。

そのため、setで既存のusername情報を管理(user_name_box)し、新規登録しようとしているusernameがuser_name_boxの中にあるかどうかで登録できるかを決めます。

コード

import sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def II(): return int(sys.stdin.readline())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def S(): return sys.stdin.readline().rstrip()
readline = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)

N = II()
user_name_box = set()
for i in range(N):
    user_name = S()#文字列受け取り
    if user_name not in user_name_box:#既存のusernameでなければ
        print(i+1)#0はじまりなので、+1
        user_name_box.add(user_name)#既存のusernameboxにusernameを追加

まとめ

前の問題【026 – Independent Set on a Tree(★4)】
次の問題【028 – Cluttered Paper(★4)】

コメント

タイトルとURLをコピーしました