파이썬 같은 언어는 10,000자리 정도의 자연수도 자유롭게 다룰 수 있습니다.
하지만 C/C++이라면 이 문제를 어떻게 풀까요? C/C++ 사용자가 아니더라도 고민해 보면 좋을 것입니다.
-> 문제의 부연설명으로 C++의 자연수 자릿수에 대한 이야기가 있었다.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int A[100001], B[100001], rslt[100001];
int carry = 0;
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.length(); i++) {
char tmp = s1.at(i);
A[s1.length() - i - 1] = atoi(&tmp);
}
for(int i = 0; i < s2.length(); i++) {
char tmp = s2.at(i);
B[s2.length() - i - 1] = atoi(&tmp);
}
for(int i = 0; i < max(s1.length(), s2.length()); i++) {
rslt[i] = A[i] + B[i] + carry;
if (rslt[i] >= 10) {
rslt[i] -= 10;
carry = 1;
}
else
carry = 0;
}
if(carry == 1)
cout << 1;
for(int i = 0; i < max(s1.length(), s2.length()); i++) {
cout << rslt[max(s1.length(), s2.length()) - i - 1];
}
cout<< '\n';
return 0;
}
정수 자료형으로는 데이터를 받기 어려우니 string 클래스를 이용하도록 한다.
string을 이용하여 큰 수를 받고 배열을 이용하여 수를 하나씩 떼서 배열에 넣는 것이다.
이 때 오프라인에서 더하기 하는 것 처럼 같은 자리 수의 숫자들을 더했을 때 10을 넘으면
그 윗자리로 수를 올려줘야하므로 carry 변수를 사용한다.
배열 크기는 문제에서 A, B 의 범위를 10의 10000제곱이라고 해서 저렇게 해놨다.
rslt 배열의 크기를 두 문자열 중 큰 녀석으로 하면 숫자가 그 이상으로 커지면 어쩌려고 걱정했는데
그것은 carry가 해결할 것이라 안-심.
사담_
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
unsigned long long A, B;
cin>> A >> B;
unsigned long long rslt;
rslt = A + B;
cout<< rslt <<'\n';
return 0;
}
테스트 케이스에 맞춰서 코드를 짰을 때에는
범위가 0~18,446,744,073,709,551,615 인 unsinged long long 자료형을 사용하였다.
너무 간단한 거 아냐?라고 생각하는 순간 '틀렸습니다'가 떴고,
질문 게시판에 들어가서 다른 사람들의 코드를 대충 훑어보니
다들 전혀 다른 방법으로 풀고있다는 걸 알았다.
그리고 위에 부연설명을 다시 읽어보니 10,000인 수가 아니라 만자릿수를 다룰 수 있어야 한다고 덜덜..
그러니까 long long을 넘어가는 문제였던 것이다.
'Practice & Study > 백준 문제풀이' 카테고리의 다른 글
boj 14888 연산자 끼워넣기 (python) (0) | 2022.05.29 |
---|---|
boj 2309 일곱 난쟁이 (python) (0) | 2022.05.25 |
boj 1158 요세푸스 문제 (python) (0) | 2022.05.14 |
boj 1978 소수 찾기 (c++) (0) | 2021.05.21 |
boj 1011 Fly me to the Alpha Centauri (c++) (0) | 2021.05.09 |