이번 문제. 아주 간단해보인다. 실제로도 그렇게 어려운 문제는 아니었다.
문자열로 입력받은 다음에 정수로 형변환 해준 다음 곱하면 되겠다 싶었음.
<정답>
#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로 바꾸니까 맞았다.
'TIL > 백준' 카테고리의 다른 글
백준_4375 : 1 - 모듈러 산술 (1) | 2024.09.06 |
---|---|
1292 : 쉽게 푸는 문제 - 이제 쉽네. 수열 더하기 (0) | 2024.08.28 |
16173 : 점프왕 쩰리 - 재귀함수 (0) | 2024.08.27 |
18406 : 럭키 스트레이트 - 숫자 반반 나눠서 각각의 합 비교하기 (0) | 2024.08.24 |
4470 : 줄번호 - 2차원 배열에 공백 문자열 입력하기 (C) (1) | 2024.08.19 |