오늘 백준 단계별로 풀어보기 수학파트를 풀려고 문제들을 보다가 등급이 가장 낮은 브론즈5등급인 백준 10757번의 큰수 A+B를 풀기로 했다.
말 그대로 엄청난 큰수가 들어올 때, 이 두 숫자를 합을 구하는 문제이다. 숫자가 굉장히 크기 때문에 일반적인 longlong과 같은 자료형을 쓸수가 없어, 문자형 str 을 사용하여 문제를 풀어보았다.
#include <iostream>
#include<algorithm> //
using namespace std;
int main() {
string a, b;
cin>> a >> b;
int a_length = a.length();
int b_length = b.length();
if(a_length > b_length){
swap(a,b);
swap(a_length, b_length);
}
string tmp = "";
if (a_length != b_length){ //두 숫자의 길이가 다를경우
for (int i = 0; i < (a_length - b_length); i++)
tmp += "0";
}
b = tmp+b;
string result = "";
int round = 0; //반올림
int x, y, digit;
for (int i=a_length-1; i>=0; i--){ //맨 뒷자리부터 더하기
x = a[i] - '0'; //여기서 0을 뺴주면 문자를 숫자로 바꿀수 있음(첨암)
y = b[i] - '0';
digit = x + y;
if (round == 1) {
digit++;
round = 0;
}
if (digit > 9) //만약 숫자가 9보다 클 경우 반올림을 해준다.
round = 1;
result += digit%10 + '0';
}
if (round == 1) //반올림을 해주기
result += "1";
for (int i=result.length() - 1; i>=0; i--){
cout << result[i];
}
}
문자열로 풀어보려는것까지는 시도했지만, 반올림과, 만약 입력받은 숫자의 길이가 다를경우 줄맞춤 부분에서 많은 어려움을 느꼈고, 블로그를 참고하였다. 내가 문자열에 대해서 많이 부족하다는것을 느끼게 해준 문제였다.그리고 이 문제는 체감상 브론즈 5등급 문제는 아닌 것 같다.
그리고 -'0'을통해서 문자열을 숫자로 바꿀수 있는것을 이번에 첨 알았다.
링크텍스트