[백준/ 파이썬] 19941번 햄버거 분배

김민구·2022년 5월 17일
0

백준 풀이

목록 보기
14/18

백준 19941번 햄버거 분배

19941번 문제는 햄버거 문제였습니다.

문제 자체를 이해하기에 어렵지는 않았습니다. 문제부터 해석해보겠습니다.

햄버거와 사람이 번갈아 가면서 놓여있는 상태에서, 사람들은 자신의 위치를 기준으로 앞, 뒤로 K번째 떨어져있는 햄버거를 먹을 수 있습니다.
이때 최대로 먹을 수 있는 사람들의 수를 구해주면 됩니다.

처음 이 문제를 접했을때 저는 파이썬에서 리스트를 슬라이싱 해야겠다고 생각을 했고 그리고 그 범위안에서 햄버거가 존재하는 하지 않는지 찾아야겠다고 생각을 했습니다.

자 그러면 한번 생각을 정리해보겠습니다.

  1. 주어진 리스트를 슬라이싱 해야겠다. 무엇을 기준으로? 현재 위치로 부터 +/- k
  2. 그 범위 안에서 햄버거가 존재하는가?

그런데 여기서 한가지 문제점이 있었습니다.
코드를 보면서 이야기 해보겠습니다.
다음은 범위안에있는 햄버거를 찾는 코드입니다. 이 코드에는 문제점이 없습니다.

        if 'H' in position[left:right]:
            idx = position[left:right].index('H') + left
            position[idx] = 'Z'
            cnt += 1

여기서 인덱스를 찾을때 left를 더해준것을 볼 수 있습니다. 그 이유는 우리가 단순히 슬라이싱된 리스트에서 인덱스를 찾게되면 0부터 시작하게 된다는 점입니다. 0부터 시작하게 되면 실제 위치와는 다른 위치에 존재하게 됩니다. 그래서 그 부분을 수정하고자 left를 더해준것입니다.

아! 그리고 기본적으로 left와 right는 각각 i-k와 i+1+k입니다.
그런데 i-k가 0보다 작을수도 있고 i+k가 n보다 커질수도 있습니다. 그 부분을 잘 고려해줘야합니다.
0보다 작으면 0부터 시작하면 되고, i+k가 n보다 커지면 리스트의 마지막까지 포함시켜주면 됩니다.

전체코드

n, k = map(int, input().split())
position = list(input())

#left와 right는 슬라이싱할 범위라고 생각
left = 0
right = n
cnt = 0
for i in range(n):
    left = i-k
    right = i+1+k
    if i-k < 0:
        left = 0
    if i+k > n:
        right = n
    if position[i] == 'P':
        if 'H' in position[left:right]:
            idx = position[left:right].index('H') + left
            position[idx] = 'F' #햄버거를 찾았으면 다른 값으로 변경
            cnt += 1
print(cnt)
profile
성장하는 개발자가 되고싶어요😀

0개의 댓글