일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 블록체인
- off-chain
- #싸지방dns
- 17119
- 10172
- 체인링크
- 탈중앙화
- 2839번
- 백준 2439번
- 백준 10172
- 컴퓨터 아키텍쳐
- 일본여행 #나고야 #일본 #일본맛집 #아스칸논신궁
- #싸지방
- 백준 17118
- 백준 1065번
- 클럭 주기
- 클럭사이클
- 백준 17119
- 설탈 배달
- 백준 2839번
- 백준
- 알고리즘
- 그대로 출력하기
- 백준 10172번
- 백준 알고리즘
- #싸지방 유튜브
- 카르테시
- On-chain
- 백준 알고리즘 설탕
- 프로그래밍
- Today
- Total
킵고잉
백준 알고리즘 11720번 숫자의 합 본문
군 복무 중에 코딩 공부 하는게 어렵지 않다는걸 깨달은 후에 여기서 공부한 것들을 조금이나마 남겨볼 생각으로 블로그가 내 성격에 맞지 않더라도 시작했다. 이미 여러 시행 착오 끝에 15문제 이상 풀었지만 오늘 푸는 문제 부터라도 계속 해서 기록해 나갈 생각이다. 자 그럼 문제부터 보자!
문제
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
출력
입력으로 주어진 숫자 N개의 합을 출력한다.
사진으로 깔끔하게 올리려고 했으나 Adobe Flash Player가 깔리지 않는 관계로 일단 복붙해서 올리기로 했다.
이 문제를 보고 처음에는 어떻게 해야할지 감이 오지 않았다. 배열과 문자열을 이용해야 하나라는 고민도 했었지만, 아쉽게도 그게 문제가 아니었다.
곰곰히 생각해본 결과 ! 이 문제는 연산만 잘 하면 풀릴 문제였던 것이다. 우리가 일반적으로 계산을 할 때
( 자연수 ) / (자연수) = (실수)
로 계산하여 소수점 까지 계산하여 보여준다. 하지만 프로그래밍에서는 컴퓨터가 조금 (?) 바보 같은 덕에 위의 문제를 풀 힌트를 얻었다. 우리가 만약에 똑같은 연산을 한다면
(자연수) / (자연수) = (몫) .... (나머지)
형태로 계산하기에 '/' 연산자나 '%' 연산자에 따라 몫 또는 나머지를 표현한다. 그렇다면 10으로 그 수를 나눈다면 당연히 나머지는 1의자리수로 나올꺼고 몫은 1의 자리수를 제외하고 나머지 숫자들을 계속 가지고 있을 것이다.
그럼 얼마나 나눌지는 어떻게 결정할까? 나누는 횟수는 조금만 생각해본다면 숫자의 개수가 주어진 변수만큼 나눈다면 그리고 그 나눈 나머지만 출력을 한다면 마지막 한 자리만 남았을 때 10으로 나눠도 마지막 그 한 자리를 나머지로 반환해 줄 것이다. 쉽게 예를 들어 이야기하면
5 / 10 = 0.5 가 아니라 5 / 10 = 0 .... 5 로 나오기에
5 % 10 = 5 라는 연산이 나올 것이다. 이것을 바탕으로 프로그램을 짜면
int main(){
int a = 0, b = 0, total_num = 0;
int digit [99] = {0};
scanf("%d %d", &a, &b);
for(int i = 0; i < a ; i++){
digit[i] = b % 10;
b /= 10;
total_num += digit[i];
}
printf("%d", total_num);
}
이렇게 나온다. 일단 10자리 까지도 무리없이 돌아간다.
그런데 문제는 15자리부터 넘어가면 -1 즉 데이터 형을 벗어난다는 것이다. long을 넣어봐도 넘어간다는거 같은데.... 이러면 문자열로 다시 받는 방법을이용해야한다.
일단 문자열로 받는 경우로 프로그램을 짠다면
#include <stdio.h>
int main(void) {
int a= 0, sum = 0 , cnt;
char b[100] = { 0 };
char c[1] ={ 0 };
scanf("%d %s", &a,&b);
for (int i = 0; i < a; i++) {
c[0] = b[i];
cnt = c[0];
sum += cnt -'0';
}
printf("%d", sum);
return 0;
}
이렇게 된다. 처음에 제일 많이 고민했던것은 바로 '0' 에대한것이었다.
'아스키 코드'
이거에 대한 존재를 몰랐던 나는 한참동안 고민할 문제였다. 일단 문자열에서 숫자로 옮길때 당연히 문자였던것이 동일 하게 숫자로 가는것은 말이안된다. 하지만 이 말도 안되는 것을 믿었던(?) 나는 계속해서 왜 숫자가 말도안되게 큰 숫자가 나오는지가 의문이었다. 아스키코드에 대한 내용을 보게 된다면 우리가 숫자를 0으로 만들게 된다면 0~9는 48부터 58까지로 변환되게 된다. 그러니 우리가 매번 저장할때마다
'0'이나 48을 빼줘야지만 우리가 의도한 값이 나온다는것이다. 이렇게 프로그래밍 초보인 나는 또 새로운걸 배우게 됐다. 아스키 코드!
'백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 17118번, 17119번: 그대로 출력하기 (0) | 2018.08.29 |
---|---|
백준 알고리즘 1110번: 더하기 사이클 (0) | 2018.08.27 |
백준 알고리즘 10817번: 세수 (0) | 2018.08.27 |
백준 알고리즘 4344번: 평균은 넘겠지 (0) | 2018.08.27 |
백준 알고리즘 10871번: X보다 작은수 (0) | 2018.07.04 |