🤯 코딩테스트/C/C++

[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 코드구현력 기르기 - 자릿수의 합

kangkibong 2022. 8. 22. 18:36

문제

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하세요. 각 자연수의 자릿수의 합을 구하는 함수를 int digit_sum(int x)를 꼭 작성해서 프로그래밍 하세요.

💡 입력설명
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 10,000,000를 넘지 않는다.

💡 출력설명
자릿수의 합이 최대인 자연수를 출력한다. 자리수의 합이 최대인 자연수가 여러개인 경우 그 중 값이 가장 큰 값을 출력합니다.

💡 입력예제
5
125 15232 79 1325 97

💡 출력예제
97

 


코드

첫 번째 풀이

#include <stdio.h>

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

int main() {
	int n, i, input, max = -2147000000;
	int res[101];
	int sum[101];
	int qwer[101];
	scanf("%d", &n);
	
	for(i = 0; i < n; i++) {
		scanf("%d", &input);
		res[i] = input;
		sum[i] = digit_sum(input);
	}
	
	// 각자리합의 최대값 구하기 
	for(i = 0; i < n; i++) {
		if(sum[i] > max) {
			max = sum[i];
		}
	}
	
	// 각자리합의 최대값과 같은 입력값 qwer배열에 할당 
	int j = 0;
	for(i = 0; i < n; i++) {
		if(sum[i] == max) {
			qwer[j] = res[i];
			j++;
		}
	}
	
	// 입력값중에 가장 큰 값 a에할당 
	int a = qwer[0];
	for(i = 1; i < j; i++) {
		if(qwer[i] > a) {
			a = qwer[i];
		}
	}
	printf("%d", a);
	
	return 0;
}

최종 풀이

#include <stdio.h>

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

int main() {
	int n, i, num, sum = 0, res, max = -2147000000;
	scanf("%d", &n);
	for(i = 0; i < n; i++) {
		scanf("%d", &num);
		sum = digit_sum(num);
		if(sum > max) {
			max = sum;
			res = num;	
		} else if(sum == max) {
			if(num > res) {
				res = num;
			}
		}
	}
	printf("%d", res);
	return 0;
}

 


설명

사용자로부터 n번 입력받고 n번 반복하는 for문을 작성한다.

n번 자연수를 입력받고 해당 num을 digit_sum함수에 인자로 할당한다.

digit_sum함수는 입력받은 n이 0보다 클 때 반복되는 while문을 작성하고 num을 10으로 나눈 나머지값을 sum에 더해나가고 몫은 num에 할당해나간다. 마지막으로 while문이 끝나면 해당 sum을 return한다.

return한 sum을 main의 sum에 할당하고 해당 sum이 max보다 클 경우 max에 sum을 할당하고 res에는 각 자리수의 합이 최대값에 해당하는 num을 할당한다. 만약 sum과 max가 같을 경우 res보다 큰 num을 res에 다시 할당하고 최종적으로 res를 출력하도록 한다.

 


배운 점

1. 사용자로부터 입력에 대한 최대값을 따로 구하고 최대값과 같은 입력값을 새로운 배열에 할당하였지만 새로운 배열을 만들지 않고도 새로운 변수만으도 반복문을 줄일 수 있다는 것을 알게되었다.

2. int 배열은 마지막 index에 NULL이 할당되지 않는다.

 


 

해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.