9037

#include <stdio.h>
#include <stdlib.h>

// 모든 요소가 같은 숫자일 경우 1 반환
// 요소 하나만이라도 다르면 0 반환
int is_same(int *arr, int size){
    int same = 1;
    for(int i = 1; i < size; i++){
        if(arr[i] != arr[i-1]){
            return 0;
        }
    }

    return 1;
}

// 오른쪽아이에게 사탕 절반 주고 그 과정에서 홀수이면 +1로 바꾸는 함수 
void half_sum_adjusted_to_even(int * arr, int size){
    // 먼저 자기가 가진 사탕 수 반을 half 배열에 저장
    int *half_arr = (int*)malloc(sizeof(int)* size); 
    for(int i = 0; i < size; i++){
        half_arr[i] = arr[i]/2;
    }

    for(int i = 0; i < size; i++){
        // 오른쪽 아이에게 사탕의 절반 주기 
        if(i == 0){
            arr[i] = half_arr[i] + half_arr[size-1];
        }
        else{
            arr[i] = half_arr[i] + half_arr[i-1];
        }

        // 받은 사탕 수가 홀수면 +1
        if(!(arr[i] % 2 == 0)){
            arr[i] ++;
        } 
    }

    free(half_arr);
}

int main(void){
    // 테스트 케이스 입력
    int test_case = 0;
    scanf("%d", &test_case);

    for(int i = 0; i <test_case; i++){
        // 아이의 인원 입력
        int child_num = 0; 
        scanf("%d", &child_num);

        int *arr = (int*)malloc(sizeof(int)* child_num);
        for(int j = 0; j < child_num; j++){
            // 각각의 사탕 개수 입력
            int candy_num = 0;
            scanf("%d", &candy_num);

            // 만약 캔디 개수가 홀수면 +1 해서 arr[j]에 저장
            if(candy_num % 2) candy_num++;
            arr[j] = candy_num;
        }

        int count = 0;
        // 모든 아이가 동일한 개수의 사탕을 가지고 있으면 반복문 종료
        while(!is_same(arr, child_num)){
            // 오른쪽아이에게 사탕 절반 주고 그 과정에서 홀수이면 +1로 바꾸는 함수 
            half_sum_adjusted_to_even(arr, child_num);
            // 순환 횟수 count;
            count ++;
        }

        // 동적 메모리 풀어주기
        free(arr);
        // 순환 횟수 출력
        printf("%d\n", count);
    }


    return 0;
}

 

+ Recent posts