종강하고 처음으로 백준을 풀었는데
감을 다 잃었다.
C언어에 대한 감도 잃었고 문제풀이 감도 잃었다.
그래서 다시 써본다!
문제
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
출력
입력으로 주어진 숫자 N개의 합을 출력한다.
예제 입력 1
1
1
예제 출력 1
1
예제 입력 2
5
54321
예제 출력 2
15
예제 입력 3
25
7000000000000000000000000
예제 출력 3
7
예제 입력 4
11
10987654321
예제 출력 4
46
이 문제를 처음에는
#include <stdio.h>
int main() {
int N;
scanf("%d\n", &N);
int arr[N];
for(int i=0; i<N; i++) {
scanf("%d", &arr[i]);
}
int sum;
sum = 0;
for(int i=0; i<N; i++) {
sum += arr[i];
}
printf("%d", sum);
}
이렇게 풀었다...
근데 당연히 맞은 줄 알았다. 그렇지만 틀렸다..!
개념 다 까먹은 나는 절대 몰랐다.
최후의 수단으로 구글링을 했다..
열심히 구글링하며 찾은 문제점
1) '공백없이' 받는 것인데 scanf는 항상 끝에 '\0'이라는 공백이 따라옴.
2) 하지만 이 '\0'은 절대로 제거가 되지 않음.
3) 그래서 차라리 문자로 바꾸고 '0'을 빼는 것 (아스키 코드)
아스키 코드는 각 문자마다 숫자가 부여됨.
'0'은 48, '5'는 53 이렇게!
그래서 아싸리 아스키 코드로 변환해주고 이 정수값(아스키 코드)들로만 빼는 것.
그러면 정수끼리 빼는 것이기 때문에 '0'을 뺄 일도 없고 간단히 숫자로만 계산하는 것이다.
#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
char arr[N];
scanf("%s", arr);
int sum = 0;
for(int i=0; i<N; i++) {
sum += arr[i]-'0';
}
printf("%d", sum);
return 0;
}
그래서 이렇게 수정하였다.^^
아예 문자로 입력받고 아스키 코드로 변환해서 계산하기.
이 문제의 핵심은 '공백없이'받는 것이기 때문에 아스키 코드의 사용이 중요하다.
여기서 문제!!
공백 없이 받는건 뭐고 공백 있게 받는건 뭘까?

이게 공백 없이 받는 것이다.
공백까지만 입력을 받는다는 것이다.
그래서 Hi다음에 있는 공백까지 출력된 것이다.
그러면 공백포함 받으려면 어떻게 해야할까??
입력을 [^\n]형식으로만 받는다!

그러면 이렇게 공백까지 완전하게 받아진다.