https://www.acmicpc.net/problem/11720
11720번: 숫자의 합
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
www.acmicpc.net
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int n = 0, sum = 0, i = 0;
char a[100];
scanf("%d", &n);
scanf("%s", a);
while (a[i] != 0) {
sum += (a[i] - '0');
i++;
}
printf("%d", sum);
return 0;
}
풀이 전
이 문제를 보자마자 아스키코드와 관련된 문제겠거니 했다.
아스키코드란?
컴퓨터는 오로지 숫자만 표현할 수 있을 뿐 글자(문자)를 표현할 수 없었다.
따라서 대안으로 특정 숫자를 문자로 규정하기로 하였는데 이를 '부호체계'라고 한다.
과거에는 부호체계가 컴퓨터 제조사마다 달랐지만 하나로 통일 된것이 ASCII코드이다.
+7비트로 문자를 표현하는 코드체계였으나 여기에 확장 비트를 하나 더해 8비트로 표현된다.
영문 한 글자를 저장할 수 있는 메모리의 크기가 8비트(1Byte)인 이유도 이 때문이다.
N개의 숫자가 공백없이 쓰여져있기 때문에 int자료형 배열을 선언하여 초기화한다면
어차피 원소의 수는 하나일 것이다.
물론 초기화 된 값을 각 자리수를 나누어 각각 더한다면 될 수 있을 지 몰라도 굉장히 비효율적이고
첫 줄에 숫자의 개수가 주어지는 문제의 취지와도 맞지 않다.
따라서 char자료형 배열이 선언되어야하는데
이유는 char자료형 배열은
ex)char a[4] = {'a','b','c'}
a[0] = a a[1] = b a[2] = c a[3] = NULL(0,'\0')으로 구성되기 때문이다!
그렇다면 위에서 기술한 아스키코드와 위 예제를 접목시켜보면
각각의 문자는 ASCII코드에 의해 특정 숫자에 대응할 것이다.https://www.easycalculation.com/ascii-hex.php
String to ASCII chart, ASCII to decimal convertor, String to decimal converter, string hexadecimal / hex conversion
www.easycalculation.com
위 사이트를 통해 대응시켜볼 수 있다.
종합해보면
아 그럼 두번째 줄에 숫자를 입력하면 각각의 char 문자열 원소에 대응하겠구나를 알 수 있다.
그렇게 문자끼리 덧셈연산을 수행하여 int자료형으로 출력하면
아스키코드에 대응되는 수가 나오게 되는데
위 문제에서는 한 자리 수의 덧셈이기 때문에 덧셈연산이 한 번 수행될 때마다 0에 해당하는 아스키 코드 값을 뺄셈해주면 된다.
(0~9까지는 1씩 증가하는 아스키코드 값을 가지고 있기 때문이다. 0은 48)
풀이 후
문자열에 대한 기초 중에 기초를 복합적으로 확인할 수 있었다.
'Baekjoon' 카테고리의 다른 글
[C] 백준 2675번 : 문자열 반복 (0) | 2023.01.15 |
---|---|
[C] 백준 10809번 : 알파벳 찾기 (0) | 2023.01.15 |
[C] 백준 10951번 : A + B - 4 (2) | 2023.01.13 |
[C] 백준 9498번 : 시험 성적 (0) | 2023.01.11 |
[C] 백준 5597번 : 과제 안 내신 분..? (0) | 2023.01.11 |