본문 바로가기

programming/알고리즘 풀이

[백준 알고리즘] 11720번 - 숫자의 합

반응형

1. 문제, 예시 실행결과

 

 이번 카테고리는 문자열! 가장 긴장하고 있는 부분이다. 사실 포인터나 배열같은 부분도 자잘한 문법들이 많고 틀리기 쉬운 부분이 많다고 생각한다. 나도 시험 보기 전날에만 달달 외웠지 막상 문자열이나 문자열을 가리키는 포인터에 대한 문법문제를 푼다면 많은 문제에서 어려움을 느낄것이다. 아마 구글이 없었다면, 항상 전공책을 들고다녔을 것 같다...... 이번 카테고리를 풀면서 나의 이런 부분을 보완하고 그런 과정을 블로그에 올렸으면 좋겠다. 다음은 이번에 풀어볼 문제이다.

 

출처: https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net


문제 11720번


 문제만 보면 "잉? 이게 왜 문자열 카테고리지?" 라는 생각이 들 수 있다. 심지어 나도 그런생각을 하고 나머지 연산자를 사용해 문제를 풀다가 예외를 느끼고 다시 문자열로 풀긴 하였다. 설명은 밑에서 하고 먼저 예시 실행결과를 보자.

 


11720번 예시 실행결과


 예제 입력 4가 우리가 이 문제를 문자열로 풀어야하는 증거이다. 다음은 문제 풀이이다.

 

2. 문제풀이

 

 오류를 발견하기 전에는 코드를 다음과 같이 작성하였다.

 

#include <stdio.h>

int main(void) {
	int buff;
	int num;
	int sum = 0;

	scanf("%d", &buff);
	scanf("%d", &num);

	for (int i = 0; i < buff; i++) {
		sum = sum + (num % 10);
		num = num / 10;
	}
	
	printf("%d", sum);

	return 0;
}

 

 모든 예시 입력에는 답을 잘 출력하였지만, 예제 4의 입력에만 음수가 나온다. 이유를 따져보니 10987654321 이라는 입력은 1 + 0 + 9 + 8 + 7 + 6 + 5 + 4 + 3+ 2 + 1의 값을 반환해야 하지만, 위의 방식대로 하면 0을 반환하지 못하는 상황이 발생한다. 그래서 결국은 숫자를 문자열로 입력받고, 하나하나 수를 더해주는 방식을 사용할 수 밖에없다. 다음은 정답 코드이다.

 

#include <stdio.h>
#define SIZE 100

int main(void) {
	int buff;
	char numStr[SIZE];
	int sum = 0;

	scanf("%d", &buff);
	scanf("%s", numStr);
	
	for (int i = 0; i < buff; i++)
		sum = sum + (numStr[i] - '0');
	printf("%d", sum);
	return 0;
}

 

문자를 숫자로 변환하는 방법에 대해서는 다른 카테고리에서 더욱 자세히 다룰 것이다.

 

3. 결어

 

 이번 문제를 풀면서 벌써 새로운 것을 배웠다. 이것은 이 블로그에 더 자세히 올렸으면 좋겠다.

반응형