본문 바로가기
Programming Language/C C++

[알고리즘 문제풀이] 10. 자릿수의 합★

by 9루트 2022. 1. 5.

첫번째 나의 삽질: 배열 두 개를 이용하여 자연수, 자릿수합을 구하려고 했다

그러나, 답이 자꾸 나오지 않는다..

#include <stdio.h>
int main(void){
   freopen("input.txt", "rt", stdin);

   // 1. 자연수를 입력 받는다.
   int n = 0;
   scanf("%d", &n);
   int array[n];
   scanf("%d", &array);
   

   // 2. 각 자릿수의 합을 구한다. 
   int sum[n] = {0,};
   
   int max = 0;
   for( int i = 0; i < n; i++){
   	int a = 0;
	      for( int j = 8; j = 0; j--){
	    	sum[i] = sum[i] + a / 10^j;
			a = array[i] % 10^j;
		  }
	  }

  	
  	printf("%d", sum[5]);
  	
  	/*
  	// 3. n개의 자릿수 합들을 비교하여 큰 값을 출력한다.
  	for(int i = 1; i <= n; i++){
  		if( sum[i] > sum[i-1]) {
	  	max = array[i];
	  }
	}
	   printf("%d", max);
  	*/
      

}

 

배열을 쓰지 않고 짜보기로 했다.

또 문제에서 주어진대로 함수를 만들어보자

#include <stdio.h>
int tmp, sum = 0;
   int digit_sum(int x){
   	while(x > 0){
   		tmp = x;
   		sum = sum + tmp % 10;
   		x = tmp / 10;
	   }
   	return sum;
   }
   
int main(void){
   //freopen("input.txt", "rt", stdin);
   // 1. 자연수를 입력 받는다.
   int n, num = 0;
   int result = 0;
   scanf("%d", &n);	
   
   for(int i = 0; i < n; i++){
	   	scanf("%d", &num);
	   
	   	// 2. 각 자릿수의 합을 구한다. 
	   int sum = digit_sum(n);
	
		// 3. n개의 자릿수 합들을 비교하여 큰 값을 출력한다.
	   int max = -2147000000;
	   if(sum > max){
	   	max = sum;
	   	result = num;
	   }
	   // 자릿수 합이 같을 때 큰 값을 출력한다. 
	   else if(sum == max){
	   	if(num > result) result = num;
	   }
   }
   
   printf("%d", result); 
}

채점 결과

엥??

잘못된 함수 구현

int tmp, sum = 0;
   int digit_sum(int x){
   	while(x > 0){
   		tmp = x;
   		sum = sum + tmp % 10;
   		x = tmp / 10;
	   }
   	return sum;
   }

125의 각 자릿수 합을 구한다고 했을 때

tmp 125 12 1
result 5 5  + 2 5 + 2 + 1

5 → 2 → 1 역순으로 자릿수를 더한다고 보면 된다.

 

옳은 함수 구현

int digit_sum(int x){
   	int tmp, sum = 0;
   	while(x > 0){
   		tmp = x % 10;
   		sum = sum + tmp;
   		x = x / 10;
	   }
   	return sum;
   }

함수 안에서! tmp, sum = 0으로 초기화해주자

		tmp = x;
   		sum = sum + tmp % 10;
   		x = tmp / 10;

이 세 줄로 바꾸어도 상관없다.

sum += tmp; 로 간략하게 써줘도 된다.


해답 및 최종 구현

#include <stdio.h>

   int digit_sum(int x){
   	int tmp, sum = 0;
   	while(x > 0){
   		tmp = x % 10;
   		sum = sum + tmp;
   		x = x / 10;
	   }
   	return sum;
   }
   
int main(void){
   //freopen("input.txt", "rt", stdin);
   // 1. 자연수를 입력 받는다.
   int n, num = 0;
   int sum, result = 0;
   int max = -2147000000;
   scanf("%d", &n);	
   
   for(int i = 0; i < n; i++){
	   	scanf("%d", &num);
	   
	   	// 2. 각 자릿수의 합을 구한다. 
	   sum = digit_sum(num);
	
		// 3. n개의 자릿수 합들을 비교하여 큰 값을 출력한다.
	   if(sum > max){
	   	max = sum;
	   	result = num;
	   }
	   // 자릿수 합이 같을 때 큰 값을 출력한다. 
	   else if(sum == max){
	   	if(num > result) result = num;
	   }
   }
   
   printf("%d\n", result); 
}

 

오예