https://www.acmicpc.net/problem/19941
기다란 벤치 모양의 식탁에 사람들과 햄버거가 단위 간격으로 놓여 있다. 사람들은 자신의 위치에서 거리가 이하인 햄버거를 먹을 수 있다. (배열 요소의 양 옆의 거리는 1이다.)
식탁의 길이 , 햄버거를 선택할 수 있는 거리 , 사람과 햄버거의 위치가 주어졌을 때, 햄버거를 먹을 수 있는 사람의 최대 수를 구하는 프로그램을 작성하시오.
첫 줄에 두 정수 과 가 있다. 그리고 다음 줄에 사람과 햄버거의 위치가 문자 P(사람)와 H(햄버거)로 이루어지는 길이 인 문자열로 주어진다.
첫 줄에 햄버거를 먹을 수 있는 최대 사람 수를 나타낸다.
20 1
HHPHPPHHPPHPPPHPHPHP
8
그리디 알고리즘으로 해결 가능하다.
배열의 왼쪽부터 탐색을 시작한다고 가정하자.
햄버거가 주위에 있는지 탐색할 때에도 왼쪽부터 탐색한다면 항상 정답을 구할 수 있다.
만약 먹은 햄버거가 다른 사람이 먹었어야만 하는 햄버거라면, 그 다른 사람은 항상 더 왼쪽에 있었어야 하기 때문이다.
시간복잡도는 O(NK)를 요구한다.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
string = input()
check = [0 for _ in range(N)]
answer = 0
for i in range(N):
if string[i] == 'P':
left, right = max(0, i-K), min(N-1, i+K)
for idx in range(left, right+1):
if string[idx] == 'H' and check[idx] == 0:
check[idx] = 1
answer += 1
break
쉬운 그리디 문제이다.
만약 완전 탐색을 한다면 얼마나 걸릴까?
약 O((NK)^2) 일까? 내 생각은 그런데 정답은 모르겠다.
어쨌든 그리디 알고리즘은 위 문제와 같이 쉽거나 딱 봐도 그리디같은 느낌이 드는 것 같다.