이 문제는 C/C++ 에서 큰 정수를 다루는데 어떻게 다룰 수 있는지 배울 수 있는 문제이다.
C/C++에서 담을 수 있는 정수형 자료형으로는 택도 없이 부족한 큰 두 수가 주어진다.
그럴 때 정수를 문자열로 입력 받아서 문자형으로 해결할 수 있다.
나의 접근법은 문자열을 끝에서부터 한 자리씩 int 형으로 변환하여 더해주어 10이 넘어가면 올려주고, 안 넘어가면 그대로 두는 방식을 택했다.
이 때 문자열의 한 글자를 떼어보면 char형으로 분류되고 이를 int 형으로 변환하려 하면 해당 문자의 ASCII 코드의 정수값으로 변환되어 계산이 된다. 이 때문에 char를 int형으로 변환하기전에 '0' 으로 빼주면 ASCII 코드 표에서 상대적인 한 자리 정수값을 구할 수 있다.
이렇게 한 자리씩 계산한 다음 10을 넘어가면 rest 변수를 1로 설정해주어 다음 자리 수에서 더해지게 되고 안 넘어가면 rest 변수를 0 으로 설정해주어서 다음 자리 수에서도 계산이 되더라도 아무 영향을 주지 않도록 하였다.
이렇게 계산하고 한 가지 예외 처리를 해주자면, 맨 첫 자리까지 더해주었을 때에도 10이 넘어갔을 때 출력하고자 하는 문자열에 1을 추가해주어 종료하였다.
이렇게 풀면 해결된다.
#include <iostream>
#include <string>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string A, B;
cin >> A >> B;
int rest = 0;
string s;
int as = A.size() - 1;
int bs = B.size() - 1;
while(as >= 0 || bs >= 0){
int temp_sum;
if(as >= 0 && bs >= 0)
temp_sum = int(A[as] - '0') + int(B[bs] - '0') + rest;
if(as >= 0 && bs < 0)
temp_sum = int(A[as] - '0') + rest;
if(bs >= 0 && as < 0)
temp_sum = int(B[bs] - '0') + rest;
if(temp_sum >= 10){
s.push_back(char(temp_sum % 10) + '0');
rest = 1;
}
else
{
s.push_back(char(temp_sum) + '0');
rest = 0;
}
as--;
bs--;
if(as < 0 && bs < 0 && temp_sum >= 10)
s.push_back('1');
}
for(int i = s.size() - 1; i >= 0; i--){
cout << s[i];
}
return 0;
}
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
백준 2775 부녀회장이 될테야 (0) | 2021.02.04 |
---|---|
백준 18258 큐2 (0) | 2021.02.03 |
백준 1193 분수찾기 (0) | 2021.02.02 |
백준 2869 달팽이는 올라가고 싶다 (0) | 2021.02.01 |
백준 2292 벌집 (0) | 2021.02.01 |
이 문제는 C/C++ 에서 큰 정수를 다루는데 어떻게 다룰 수 있는지 배울 수 있는 문제이다.
C/C++에서 담을 수 있는 정수형 자료형으로는 택도 없이 부족한 큰 두 수가 주어진다.
그럴 때 정수를 문자열로 입력 받아서 문자형으로 해결할 수 있다.
나의 접근법은 문자열을 끝에서부터 한 자리씩 int 형으로 변환하여 더해주어 10이 넘어가면 올려주고, 안 넘어가면 그대로 두는 방식을 택했다.
이 때 문자열의 한 글자를 떼어보면 char형으로 분류되고 이를 int 형으로 변환하려 하면 해당 문자의 ASCII 코드의 정수값으로 변환되어 계산이 된다. 이 때문에 char를 int형으로 변환하기전에 '0' 으로 빼주면 ASCII 코드 표에서 상대적인 한 자리 정수값을 구할 수 있다.
이렇게 한 자리씩 계산한 다음 10을 넘어가면 rest 변수를 1로 설정해주어 다음 자리 수에서 더해지게 되고 안 넘어가면 rest 변수를 0 으로 설정해주어서 다음 자리 수에서도 계산이 되더라도 아무 영향을 주지 않도록 하였다.
이렇게 계산하고 한 가지 예외 처리를 해주자면, 맨 첫 자리까지 더해주었을 때에도 10이 넘어갔을 때 출력하고자 하는 문자열에 1을 추가해주어 종료하였다.
이렇게 풀면 해결된다.
#include <iostream>
#include <string>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string A, B;
cin >> A >> B;
int rest = 0;
string s;
int as = A.size() - 1;
int bs = B.size() - 1;
while(as >= 0 || bs >= 0){
int temp_sum;
if(as >= 0 && bs >= 0)
temp_sum = int(A[as] - '0') + int(B[bs] - '0') + rest;
if(as >= 0 && bs < 0)
temp_sum = int(A[as] - '0') + rest;
if(bs >= 0 && as < 0)
temp_sum = int(B[bs] - '0') + rest;
if(temp_sum >= 10){
s.push_back(char(temp_sum % 10) + '0');
rest = 1;
}
else
{
s.push_back(char(temp_sum) + '0');
rest = 0;
}
as--;
bs--;
if(as < 0 && bs < 0 && temp_sum >= 10)
s.push_back('1');
}
for(int i = s.size() - 1; i >= 0; i--){
cout << s[i];
}
return 0;
}
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
백준 2775 부녀회장이 될테야 (0) | 2021.02.04 |
---|---|
백준 18258 큐2 (0) | 2021.02.03 |
백준 1193 분수찾기 (0) | 2021.02.02 |
백준 2869 달팽이는 올라가고 싶다 (0) | 2021.02.01 |
백준 2292 벌집 (0) | 2021.02.01 |