728x90
▶문제 : 코딩테스트 연습 - 디펜스 게임 | 프로그래머스 스쿨 (programmers.co.kr)
▶코드 작성
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n, int k, int enemy[], size_t enemy_len) {
if (k > enemy_len) return enemy_len;//k가 enemy배열 길이보다 크면 종료
int answer = 0;
int *arr = (int *)calloc(1000001, sizeof(int));//무적권 사용한 라운드의 적 수 저장
int min = 1000000;//arr배열에서 작은 값
for (int i = 0; i < k; i++) {//k까지 먼저 무적권 사용
arr[enemy[i]]++;//각 enemy[i]값의 개수
if (min > enemy[i]) min = enemy[i];
}
for (int i = k; i < enemy_len; i++) {
if (enemy[i] > min && n - min >= 0) {//min보다 큰 값을 찾으면
arr[enemy[i]]++;//enemy[i] 무적권 사용
n -= min;//병사를 min만큼 소모
arr[min]--;//min 무적권 사용 제외
if (arr[min] == 0)//min이 제외되었으므로 다음 작은 값 찾기
for (int j = min + 1;; j++)
if (arr[j] > 0) {
min = j;
break;
}
}
else {
n -= enemy[i];//병사를 enemy[i]만큼 소모
if (n < 0) {//병사를 모두 소모하면 종료
answer = i;
break;
}
}
}
free(arr);
return (answer == 0) ? enemy_len : answer;
}
▶해석
arr배열을 이용하여 i=0부터 k-1까지 arr [적의 수]++ 하여 무적권을 모두 사용하였다.
for문으로 i=k부터 반복하기 시작하고
arr배열의 가장 작은 값인 min을 이용하여
enemy [i]가 min보다 크다면 i번째 라운드에 무적권을 사용하여 적 enemy [i]를 막고
min이었던 라운드에 무적권을 제외시키면서 병사 수 n에서 min만큼 소모하였다.
enemy [i]가 min보다 작거나 같다면 병사 수 n에서 enemy [i]만큼 소모하고
병사 수가 0보다 작으면 종료한다.
728x90
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 바탕화면 정리 C언어 (0) | 2023.03.13 |
---|---|
프로그래머스 Level 2 : 택배 배달과 수거하기 C언어 (0) | 2023.01.16 |
프로그래머스 Level 1 : 가장 가까운 같은 글자 C언어 (0) | 2022.12.19 |
프로그래머스 Level 2 : 우박수열 정적분 C언어 (0) | 2022.11.12 |
프로그래머스 Level 2 : 숫자 카드 나누기 C언어 (0) | 2022.11.10 |
댓글