문제 링크 : www.acmicpc.net/problem/15353
문제 풀이는 다음과 같다.
1. 두 숫자 a와 b를 문자열로 입력받는다.
2. 둘 중 길이가 더 긴 값을 a로 저장하고 짧은 값을 b로 저장한다.
3. 문자열 a의 값 하나하나를 int형으로 num1 배열에 저장해준다. 이때 0부터 a의 size-1까지 순차적으로 받으며, 값은 int형으로 저장한다.
또한 편의상 num1[1]부터 값을 저장해준다.
4. 문자열 b도 마찬가지로 int형 배열에 저장해준다. 한가지 유의점은, 길이가 긴 문자열 a에 맞추기 위해 num2[1]이 아닌 아래와 같은 배열의 위치에 값을 저장해준다.
for(int i=0; i<b.size(); i++) num2[i+1+a.size()-b.size()] = b[i]-'0';
5. 위의 3~4번을 통해 두 문자열 a와 b의 값이 int형으로 저장되었다. 값을 더하기 위해 for문의 시작은 a.size()부터 시작한다.
-> 배열의 크기의 역순으로 덧셈을 하는 이유는, 3~4번을 통해 두 문자열의 값이 순차적으로 저장되었고, 결국 첫째 자리의 수는 배열의 맨 마지막에 저장되었기 때문이다.
-> 이때 a.size()-1이 아닌 이유는, 우리는 편의상 3~4번의 값 모두 배열의 첫 번째 부터 저장했기 때문이다.
6. a.size()에서 0까지 모두 계산을 끝낸뒤 for문을 빠져나온다. 이때 만약 num1[0]의 값이 0이 아닌 경우엔 마지막 덧셈의 값이 10을 초과했다는 의미이므로, 정답 배열의 끝자리에 1을 추가해준다.
7. 위의 5~6번을 통해 덧셈의 값이 배열의 0번째부터 마지막자리까지 저장되었다. 이때 정답은 역순으로 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int num1[10001] = {0,}, num2[10001] = {0,};
vector<int> v;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
string a="", b="", temp = "";
int c = 0;
cin >> a >> b;
if(a.size()<b.size()){ // 긴 문자열을 a에 저장
temp = a;
a = b;
b = temp;
}
for(int i=0; i<a.size(); i++) num1[i+1] = a[i]-'0';
for(int i=0; i<b.size(); i++) num2[i+1+a.size()-b.size()] = b[i]-'0';
for(int i=a.size(); i>0; i--){
c = num1[i]+num2[i];
if(c>=10){
num1[i-1]++;
c-=10;
}
v.push_back(c);
}
if(num1[0]!=0) v.push_back(1);
for(int i=v.size()-1; i>=0; i--) cout << v[i];
return 0;
}
졸면서 풀다가 실수를 저질렀다. 자꾸 8%에서 틀리고 말았는데, a와 b중 큰 값을 저장하는 부분에서, if(a.size()<b.size())가 아닌 if(a<b)로 적었기 때문이었다.
'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글
백준 15990번 1,2,3 더하기 5 (C++) (0) | 2021.04.04 |
---|---|
백준 1793번 타일링 (C++) (0) | 2021.04.01 |
백준 11052번 카드 구매하기 (C++) (0) | 2021.03.31 |
백준 9095번 1,2,3 더하기 (0) | 2021.03.31 |
백준 11727번 2xn 타일링 2 (0) | 2021.03.31 |