백준 19941번 햄버거 분배
19941번 문제는 햄버거 문제였습니다.
문제 자체를 이해하기에 어렵지는 않았습니다. 문제부터 해석해보겠습니다.
햄버거와 사람이 번갈아 가면서 놓여있는 상태에서, 사람들은 자신의 위치를 기준으로 앞, 뒤로 K번째 떨어져있는 햄버거를 먹을 수 있습니다.
이때 최대로 먹을 수 있는 사람들의 수를 구해주면 됩니다.
처음 이 문제를 접했을때 저는 파이썬에서 리스트를 슬라이싱 해야겠다고 생각을 했고 그리고 그 범위안에서 햄버거가 존재하는 하지 않는지 찾아야겠다고 생각을 했습니다.
자 그러면 한번 생각을 정리해보겠습니다.
- 주어진 리스트를 슬라이싱 해야겠다. 무엇을 기준으로? 현재 위치로 부터 +/- k
- 그 범위 안에서 햄버거가 존재하는가?
그런데 여기서 한가지 문제점이 있었습니다.
코드를 보면서 이야기 해보겠습니다.
다음은 범위안에있는 햄버거를 찾는 코드입니다. 이 코드에는 문제점이 없습니다.
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)