[BOJ/Python]配分19941号ハンバーガー


この問題は,入力された文字列を巡回し,HとPがK距離内にあるときに,食べられたハンバーガーとハンバーガーを食べた人のインデックスを調べるchk配列のうち,最後にchk配列とs文字列を同時に巡回し,chkがTrue,sがPのときにcntを増やす方法で解決する.
  • n,kと入力します.
  • 文字列sを入力します.
  • s.k個追加します.これは、sを巡回する際にインデックスエラーの発生を除去するためである.たとえば、s[n−3]のkが5の場合、sの最後のs[n−1]からs[n+2]を巡回する必要があるため、インデックスエラーが発生する.それを阻止するために意味のない文字.k個追加します.
  • で食べたハンバーガーと、食べた人をチェックするために並んだchkはfalsen個で構成されています.
  • ハンバーガーを食べた人数を計算するために、変数cntを0と定義します.
  • sの長さのiを繰り返すfor文.
    ->s[i]がHで、chk[i]がFalseである場合.
    -->i+1からi+kまで繰り返されるjのfor文.
    ----->s[j]がPで、chk[j]がFalseである場合.
    ------>chk[j]、chk[j]をtrueに更新します.
    ------>cnt 1を増やし、重複ドアから離脱します.
    ->s[i]がPで、chk[i]がFalseである場合.
    -->i+1からi+kまで繰り返されるjのfor文.
    ----->s[j]がHで、chk[j]がFalseである場合.
    ------>chk[j]、chk[i]をtrueに更新します.
    ------>cnt 1を増やし、重複ドアから離脱します.
  • 出力
  • cnt.
  • Code

    n, k=map(int, input().split())
    s=str(input())
    s+='.'*k
    chk=[False]*n
    cnt=0
    for i in range(len(s)):
        if s[i]=='H' and chk[i]==False:
            for j in range(i+1, i+k+1):
                if s[j]=='P' and chk[j]==False:
                    chk[j]=True
                    chk[i]=True
                    cnt+=1
                    break
        if s[i]=='P' and chk[i]==False:
            for j in range(i+1, i+k+1):
                if s[j]=='H' and chk[j]==False:
                    chk[j]=True
                    chk[i]=True
                    cnt+=1
                    break
    print(cnt)