백준 11720 숫자의 합, 아스키 코드 변환 이용

리얼니트·2021년 9월 8일
0

1학년

목록 보기
12/24

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

이번 문제는 굉장히 쉬운 문제인데 삽질을 하느라 시간이 좀 걸렸다.

입력받은 숫자의 길이만큼 공백없는 숫자를 입력받고, 그 숫자의 합을 출력하는 문제이다.

처음에는 공백없는 숫자를 정수형으로 받고, 각각의 일의 자리를 10을 나눈 나머지로 배열에 저장하는 방법으로 접근을 했었다.

실패코드

#include <stdio.h>
int main(void){
    int num=0, arr=0, sum=0;
    scanf("%d",&num);
    scanf("%d",&arr);
    int aim[num];
    for(int i=0; i<num; i++){
        aim[i]=arr%10;
        printf("aim[%d]=%d\n",i,arr%10);
        arr=(int)(arr/10);
        sum+=aim[i];
    }
    printf("%d",sum);
    return 0;
}

하지만 처음 입력받은 값이 10이상만 되면 결과값이 엉망이 되었다.
가만보니 처음 입력값이 10이상이라는 것은 그 다음 정수형 변수로 받고 있는 공백없는 숫자가 10의자리 이상의 정수라는 것인데 이런 방식으로는 조건에 따라 100의자리 이상을 변수에 담을 수 있어야 했기 때문에 비효율적인 방법이었다. unsigned long으로 숫자를 담는다 해도 10자리가 최대였으니..

그래서 그냥 문자형으로 받고 아스키 코드를 정수로 변환하는 방법을 사용하기로 했다.

문자 0의 아스키코드가 48이니까, 문자 0~9까지의 아스키코드에 -48을 해주면 본래 10진수의 값 0~9와 같아진다는 점을 이용했다.

#include <stdio.h>
int main(void){
    int num=0, sum=0;
    char arr[100];
    scanf("%d",&num);
    scanf("%s",&arr);	//문자형으로 배열을 받았다
    int aim[num];	//지정한 수만큼 반복을 돌린다
    for(int i=0; i<num; i++){
        aim[i]=(int)arr[i]-48;	
        sum+=aim[i];
    }
    printf("%d",sum);
    return 0;
}

aim[i]=(int)arr[i]-48;에서
arr[0]이 5라면, 문자형으로 받았으니 정수가 아니라 문자형 5일 것이다. (int)로 받았으니 아스키코드 값인 53이 나올 것이고, 거기서 48을 빼면 십진수 5와 같다.
이런식으로 각각의 자릿수를 문자형에서 정수형으로 바꾼 값을 aim배열에 재배치하고, 각각의 값을 sum에 합산하여 출력한다.

느낀점

아스키코드를 이론으로 처음 접했을 때, 별로 쓸일이 없을 것 같아 대충보고 넘어갔었는데, 생각보다 활용할 일이 많은 것 같다.

profile
방구석에서 잘 살아요

0개의 댓글