[ BOJ / Python ] 19941번 햄버거 분배

황승환·2021년 12월 31일
0

Python

목록 보기
69/498

이번 문제는 입력받은 문자열을 순회하며 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를 False n개로 구성한다.
  • 햄버거를 먹은 사람의 수를 세기 위한 변수 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)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글