본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 숫자 카드 나누기 C언어

by starfish22 2022. 12. 19.
728x90

▶문제 : 코딩테스트 연습 - 디펜스 게임 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

댓글