백준

백준 1233번 주사위 - C언어

해보쟈 2024. 3. 7. 10:42

#include <stdio.h>
int main(void) {
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	int s1[41], s2[41], s3[41], sum[81] = { 0 };
	
    //배열에 숫자 넣어주기
	for (int i = 0; i < a; i++) {
		s1[i] = i+1;
	}
	for (int i = 0; i < b; i++) {
		s2[i] = i + 1;
	}
	for (int i = 0; i < c; i++) {
		s3[i] = i + 1;
	}
	
    //s1,s2,s3 배열들의 합을 저장하는 배열
	int p = 1;
	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			for (int k = 0; k < c; k++) {
				sum[(s1[i] + s2[j] + s3[k])+1] += p;
			}
		}
	}
	
    //최댓값 구하기
    int max = 0;
    int index;
    for(int i =0;i<81;i++){
        if(max<sum[i]){
            max = sum[i];
            index = i;
        }
    }

    printf("%d",index-1);
	return 0;
}

위 코드는 처음에 내가 작성한 코드이고, 다른 사람들의 코드를 보며 배운점을 작성하겠다.

 

먼저 처음에는

  	for (int i = 0; i < a; i++) {
		s1[i] = i+1;
	}
    
    ---------------------------------
        int p = 1;
	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			for (int k = 0; k < c; k++) {
				sum[(s1[i] + s2[j] + s3[k])+1] += p;
			}
		}
	}

위 코드를 3번 반복하여 1,2,3,4,... 배열을 저장하였고, 아래 코드를 통해 합의 수들을 저장하였다.

그러나 위 코드를 통해 배열을 저장하고, 또 합의 배열을 저장할 필요 없이 하나의 삼중 for문만을 이용하여 똑같은 동작을 수행할 수 있다. 

for(int i = 1; i<=a; i++){
	for(int j=1; j<=b; j++){
    	for(int k = 1; k<=c; k++){
        	sum[i+j+k]++;
        }
    }
}

그럼 최종 코드를 확인해보겠다.

#include <stdio.h>
int main(void) {
    int a, b, c, index, max = 0;
    scanf("%d %d %d", &a, &b, &c);
    int s1[41], s2[41], s3[41], sum[81] = { 0 };
	
    //빈도 수 저장
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                sum[i + j + k]++;
            }
        }
    }

    for (int i = 0; i < 81; i++) {
        if (max < sum[i]) {
            max = sum[i];
            index = i;
        }
    }

    printf("%d", index);
    return 0;
}

확실하게 간결해진 것을 볼 수 있다! 배고프당