코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;
char str[20001];
int n, k, cnt, found, s1, i, j;
int main() {
scanf("%d %d", &n, &k);
scanf("%s", str);
for (i = 0; i < n; i++) {
if (str[i] == 'P') {
found = 0, s1 = i - k < 0 ? 0 : i - k;
for (; s1 < i ; s1++)
if (str[s1] == 'H' && str[s1]>1) {
str[s1] = 1;
cnt++;
found = 1;
break;
}
if (!found)
for(j=i+1;j<n&&j<=i+k;j++)
if (str[j] == 'H'&&str[j]>1) {
str[j] = 1;
cnt++;
break;
}
}
}
printf("%d", cnt);
}
· 이 문제의 분류는 그리디 알고리즘이다. 최적의 경우를 골라내는 건데 그리디 알고리즘을 사용하는 이유를 생각해봤더니, 사람의 최대한 왼쪽에 있는 햄버거를 선택하면 언제나 최적의 경우의 수가 나온다는 것을 알게 되었다.
· 일단 입력받은 배열의 맨 처음부터 맨 끝까지 탐색을 한다. 그러다가 탐색중인 배열의 값이 'P'인 경우가 생기면 i-k부터 i+k까지 루프를 돌며 그 중 가장 먼저 나오는(가장 왼쪽에 있는) 'H'를 취하고(count값 증가), 그 배열값은 의미없는 값으로 바꾼다. 이 과정을 반복하면 매번 최적의 상황만 골라져서 나오기 때문에 쉽게 해결할 수 있다.
· 참고로 그리디 알고리즘을 사용할 수 있는 경우는 극히 제한적이므로 이렇게 언제나 한 가지 상황만 보고 최적의 상황을 계산해낼 수 있는 상황에서만 사용하고 그렇지 않은 경우에서는 Dynamic Programming 알고리즘을 사용해야 한다.
'programming' 카테고리의 다른 글
선린인터넷고등학교 천하제일 코딩 대회 예선 3등 후기 (1) | 2022.06.12 |
---|---|
layer7 과제 - js 코드 난독화 (0) | 2022.05.08 |
C언어 4차시 Layer7 과제 - 백준 14467 (0) | 2022.04.17 |
C언어 4차시 Layer7 과제 - 백준 21966 (0) | 2022.04.17 |
C언어 4차시 Layer7 과제 - 백준 1065 (0) | 2022.04.17 |