1. 문제 설명
공백으로 나누어지는 세 숫자가 입력되고, 세 숫자의 총합을 출력한다.
2. 접근법
1) 공백으로 구분해 주어지는 세 숫자를 입력으로 받아
2) 모두 더해 출력한다
1) 세 숫자를 입력받기
예제를 보면 입력으로 들어가는 숫자는 정수이고 따로 문제에서 명시하지 않았으므로 정수 입력으로 판단한다. 또한 입력 조건에 각 정수는 양의 정수 1보다 크고 10^12(=1조)보다 작은 크기까지 입력받을 수 있다.
정수형으로 1조까지 입력받으려면 어떤 자료형으로 선언해야 할까?
우선 정수 선언할 때 가장 많이쓰는 int의 경우를 보자.
int형으로 변수를 선언하면 4byte이다. 이는 4*8=32bit이고, 2^32의 크기를 가진다.
여기서 -부분과 +부분이 있으니 반으로 나눠주면 양의 정수 부분은 2^31의 크기를 가진다고 할 수 있다.
2^31은 얼마일까? 계산하기 힘드므로 쪼개어 생각해 보자.
2^10 = 1024이므로 대충 10^3과 비슷하게 생각하면 되어 가장 편하다.
2^31 = 2^10 * 2^10 * 2^10 *2^1로 나눌 수 있고 이는 10^9 * 2와 비슷하다 할 수 있다.
0이 9개이므로 대충 20억이다. (0이 3개 붙을때마다 ,가 붙으므로 외워두면 큰 수를 파악하기 편하다. 천, 백만, 십억, 조 순이다)
여기서 -부분을 쓰지 않고(unsigned를 앞에 붙여 unsigned int 선언) 양수 부분으로 가용 공간을 모두 끌어온다 해도 겨우 *2가 되어 40억이 한계다.
우리의 친구 int는 4byte라 공간이 부족하다.
1조인 10^12를 양의 정수로 입력받으려면 약 2^40의 공간이 필요하다(10^3이 네번 곱해지므로 2^10이 네번 곱해졌다 생각하면 편하다. 2^10=1024이므로 실제로는 2^40이 더 크다).
이는 40bit이고 5byte이다. 우리는 자료형의 크기 변화를 2배씩 올려 쓰므로 4byte로 부족하다면 8byte를 쓰면 되겠다.
8byte를 쓰는 자료형은 long long이다. 필요한 5byte를 훌쩍 넘어가므로 long long으로 선언해주면 되겠다.
long long A = 0, B = 0, C = 0;
A, B, C를 선언했다면 공백을 통해 세 양의 정수를 입력받자.
scanf("%lld %lld %lld", &A, &B, &C);
long long 정수 자료형의 경우 서식 지정자를 %d가 아닌 %lld를 사용해야 한다. A, B, C의 주소로 입력받자. printf문과 달리 변수의 값을 이용하는 것이 아닌 변수의 주소로 가서 값을 집어넣어야 하기 때문에 "&변수 이름" 을 통해 해당 변수의 주소값을 scanf 함수의 인수로 넘겨준다.
*visual studio의 경우 scanf를 보안상의 이유로 사용을 허용하지 않는다. scanf_s로 바꿔주자.
2) 모두 더해 출력하기
결과를 저장할 정수를 선언하여 출력해도 되지만 printf문에서 바로 더해 출력해도 된다.
printf("%lld", A + B + C);
3. 코드
#include <stdio.h>
int main(void) {
long long A = 0, B = 0, C = 0;
//visual studio의 경우 scanf_s("%lld %lld %lld", &A, &B, &C);
scanf("%lld %lld %lld", &A, &B, &C);
printf("%lld", A + B + C);
return 0;
}
4. 테스트 및 결과
예제 입력을 해 보자
5. 결론 및 더 생각하기
필자는 출력 문에서 수식을 사용해 A + B + C를 출력했지만 결과 변수 result 등을 따로 선언하여 계산한 뒤, result변수를 출력해도 되겠다. 실제 프로그래밍에서는 의미있는 변수명을 사용하여 후자의 방법을 따르는 것이 다른 사람들이 더 알아보기 쉬워 좋은 방법일 것 같다.
또, 정수가 들어오지 않고 문자가 들어오는 경우의 예외처리 코드를 만들어 볼 수 있겠다.
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[C언어] 쉽게 푸는 백준 25314번 코딩은 체육과목 입니다 문제 (0) | 2023.04.24 |
---|