C 언어/멘토링

[C 언어/멘토링] Baekjoon 백준 11720번 - 숫자의 합

luckyd8 2025. 5. 16. 17:32

 
공백 없는 N개의 숫자를 모두 합해 출력하는 문제이다. 
첫째 줄에 숫자 개수 N을, 둘째 줄에 숫자 N개를 공백없이 입력 받는다.
* 멘토링 과제 조건: 동적할당을 이용할 것
 
처음 시도한 코드이다.

int N;
int sum;

scanf_s("%d", &N);
char* n = (char*)calloc(N, sizeof(char));
scanf_s("%s", n);

for (int i = 0; i < N; i++)
{
    sum = (n[i] + n[i]) / 2;
}
printf("%d", sum);

 
사용자가 입력하는 숫자의 개수 N에 따라 동적으로 메모리를 할당해야 한다.
때문에 calloc을 사용해 문자열 형태의 숫자를 입력 받았다.

더보기

malloc가 아닌 calloc을 사용한 이유

- calloc은 malloc과 달리 할당한 메모리를 0으로 초기화해줍니다.

- 문자열 끝을 표시하는 널 문자(\0)가 필요한 문자 배열을 다룰 때, 초기화된 메모리를 사용하는 것이 더 안전하고 편리함

 

이후 반복문을 통해 각 문자를 더하려고 했지만, 예상한 결과가 출력되지 않았다.

 
문제의 원인은 아래와 같다.
 
1) 현재 코드는 모든 숫자의 합을 구하는 것이 아닌, 마지막 문자 하나만 계산해 sum에 저장하고 있다. 
sum = 은 누적이 아닌 새로운 값을 덮어쓰는 것으로, 아무리 반복문을 돌아도 결국 마지막 i만 남는다.
즉, sum = 이 아닌 sum =+ 을 사용해야 한다. 
 
2) n[i]는숫자가 아닌 문자이다. 
문자 코드를 더하고 있으니 n[i] + n[i] 는 '1' + '1' =  49 +49 가 된다.

sum =+ n[i] - '0';

 
여기서 - '0' 을 하는 이유는, 문자들이 실제로는 아스키 코드 값(정수)로 저장되기 때문이다.
예를 들어 문자 '3'을 정수 3으로 변환할 때, 문자 '3'의 아스키 코드 값은 51이고, '0'의 아스키 코드 값은 48이므로
'3' - '0' = 51 - 48 = 3이 되어, 변환에 성공한다.
즉, '0'을 빼면 실제 정수값으로 변환 가능하다.
단, 이 방법은 문자 '0' ~ '9'까지의 숫자 형태의 문자에만 적용 가능하다. 이번 문제에서는 숫자들이 문자로 입력되었고, 각 자리 숫자를 더하는 것이기에 사용했다.
 
sum =+ 을 사용할 경우, sum 초기화도 필요하다.

int sum = 0;

 
3) 동적 할당 시에 크기 문제도 있다. 
N 만큼만 할당 했는데, 문자열은 숫자 N개 + 문자열 끝을 나타내는 널 문자('\0')가 필요하다.
따라서, N + 1로 만큼 메모리를 할당해 널 문자를 위한 공간을 확보해야 한다.  

char* n = (char*)calloc(N + 1, sizeof(char));

메모리 해제도 필요하다.

free(n);

 
 
이를 바탕으로 수정한 최종 코드이다.

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

int main()
{
	int N;
	int sum = 0;
    
	scanf_s("%d",&N);
	char* n = (char*)calloc(N+1, sizeof(char));
	scanf_s("%s", n);

	for (int i = 0; i < N; i++)
	{
		sum += n[i] - '0';
	}
	printf("%d", sum);

	free(n);
}

 
최종 코드는 정상적으로 실행되었고, 백준에서도 정답 처리되었다.