이번 문제. 아주 간단해보인다. 실제로도 그렇게 어려운 문제는 아니었다.

문자열로 입력받은 다음에 정수로 형변환 해준 다음 곱하면 되겠다 싶었음.

 

<정답>

#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS

int main() {
	char arr[100000] = {};
	char brr[100000] = {};
	long long sum = 0;

	scanf("%s", &arr);
	scanf("%s", &brr);

	for (int i = 0; i < strlen(arr); i++) {
		for (int j = 0; j < strlen(brr); j++) {
			sum += (arr[i]-'0') * (brr[j] - '0'); // atoi 쓰는 거 아님.
			/* '0' 또는 48을 빼주면 됨.*/
		}
	}
	printf("%lld", sum);
	return 0;
}

 

근데 생각보다 많이 틀렸다. ;;

일단 나는 atoi로 배열 안의 char를 int로 바꿔주려고 했는데 atoi는 *char를 인수로 받는 것이었다.

이게 뭔 말이냐면 예를 들어 arr[10] = "12345" 일 때, 나는 '3'을 3으로 형변환 시키고 싶어서 atoi(arr[2])를 하면 에러 때문에 안 되고 atoi(&arr[2])를 하면 에러가 없어진다. 근데 이렇게 형변환 된 걸 출력하면 '345' -> 345 이렇게 형변환 된 것을 알 수 있다.

말 그대로 atoi는 문자가 아닌 문자열을 형변환 해주는 거다. (이걸 왜 이제 알았지)

 

암튼.. 그럼 문자를 형변환 하는 방법은?

숫자의 아스키 값은 48번부터 0~9를 할당하고 있으므로, char형 '0'은 정수값 48을 가진다.
따라서 0의 아스키 값인 48을 char형의 값에서 빼주면 순수한 숫자를 얻어낼 수 있다. 근데 -48을 넣으면 직관적이지가 않아서 코드를 읽기 어려움. (갑자기 48이 왜 나와? 이렇게 생각이 드니깐.)
그래서 그냥 '0'을 빼준거다.

 

방법 : -'0'을 추가한다.

 

근데 계속 틀리길래 뭐가 문제인가.. 했더니 sum의 범위가 크다는 것을 인지를 못함. sum의 형을 long long으로 바꿔주고 출력을 %lld로 바꾸니까 맞았다.