coding_test/BAEKJOON

백준 9037번 C언어 풀이

CodeJin 2021. 10. 7. 17:01

https://www.acmicpc.net/problem/9037

 

9037번: The candy war

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각각의 테스트 케이스의 첫 줄에는 아이의 인원 N (1 ≤ N ≤ 10)이 주어지고 그 다음 줄에

www.acmicpc.net

원래는 원형 큐를 사용하도록 하는 문제인 것 같은데 자료구조 모르니 그냥 풀고 나중에 다시 풀어보자

 

문제에서 시키는대로 하면 되는 문제이다.

#include <stdio.h>
#include <string.h>

// 모든 사람이 동일한 캔디를 가지고 있는지 check
// 같으면 return 1
// 다르면 return 0
int check_candys(int *candys, int n)
{
    int ret = 1;
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = i+1; j < n; j++) {
            if (candys[i] != candys[j]) {
                ret = 0;
                break;
            }
        if (!ret) break;
        }
    }
    return ret;
}

// 모든 사람이 짝수개 캔디를 갖도록 조정한다.
void make_even(int *candys, int n)
{
    int i;
    for (i = 0; i < n; i++) 
        candys[i] & 1 ? ++candys[i] : candys[i];
}
// 들고있는 캔디의 반을 우측으로 전달한다.
// Circular Queue 형태로 전달
// 0->1, 1->2, .. (n-1)-->0
void turn_over(int *candys, int n)
{
    int i;
    int tmp1, tmp2; // 더해지기 전의 값을 보존할 변수
    for (i = 0; i < n; i++) {
        candys[i] /= 2;
    }
    tmp1 = candys[0];
    for (i = 0; i < n; i++) {
        if (!i) {
            candys[0] += candys[n-1];
        } else {
            tmp2 = candys[i];
            candys[i] += tmp1;
            tmp1 = tmp2;
        }
    }
}

int main()
{
	int ntest;
	int i, n, candys[10];
	int round;

	scanf("%d", &ntest);
	while (ntest--) {
		scanf("%d", &n);
		// candy[]에 입력을 받는다.
        for (i = 0; i < n; i++) {
            scanf("%d", &candys[i]);
        }
		round = 0;
		// n==1이면 즉시 끝난다.
        if (n == 1) {
            printf("%d\n", round);
        }
        else {
    		while (!check_candys(candys, n)) { // check_candys 모두 같으면 끝난다.
        		// 모든 사람을 짝수개로 만들고
                make_even(candys, n);
                if (check_candys(candys, n)) break;
    			round++;
    			// turn_over 옆사람에게 1/2를 주고
                turn_over(candys, n);
    			// check_candys 모두 같으면 끝난다.
    			// make_even 혹시 홀수개가 있으면 모두 짝수개를 만들고
		    }
		    printf("%d\n", round);
	    }
    }
}