문제 링크
난이도 : Lv. 0
문제 내용
문제 설명
0 이상의 두 정수가 문자열 a
, b
로 주어질 때, a
+ b
의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤
a
의 길이 ≤ 100,000 - 1 ≤
b
의 길이 ≤ 100,000 a
와b
는 숫자로만 이루어져 있습니다.a
와b
는 정수 0이 아니라면 0으로 시작하지 않습니다.
입출력 예
a | b | result |
---|---|---|
”582" | "734" | "1316" |
"18446744073709551615" | "287346502836570928366" | "305793246910280479981" |
"0" | "0" | "0” |
입출력 예 설명
입출력 예 #1
- 예제 1번의
a
,b
는 각각 582, 734이고 582 + 734 = 1316입니다. 따라서 “1316”을 return 합니다.
입출력 예 #2
- 예제 2번의
a
,b
는 각각 18446744073709551615, 287346502836570928366이고 18446744073709551615 + 287346502836570928366 = 305793246910280479981입니다. 따라서 “305793246910280479981”을 return 합니다.
입출력 예 #3
- 예제 3번의
a
,b
는 각각 0, 0이고 0 + 0 = 0입니다. 따라서 “0”을 return 합니다.
문제 분석
처음에는 그냥 int로 받아서 더한거 반환했더니 틀림 알고보니 자릿수가 10만까지 되다보니까 안됐던듯
그래서 두번째에는 unsigned long long으로 바꿨는데 그래도 틀림
마지막으로 그냥 손수 더하는 코드를 짰음 각 자리를 더해서 string에 append한 다음 뒤집으면 답이 될거라고 생각했음
작성한 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string a, string b) {
string answer = "";
if(a.size() < b.size()) swap(a, b);
int more = 0;
for(int i = 0; i < a.size(); i++) {
int one;
if(i >= b.size()) {
one = a[a.size() - 1 - i]-'0' + more;
}
else {
one = (a[a.size() - 1 - i]-'0') + (b[b.size() - 1 - i]-'0') + more;
}
more = one >= 10? 1 : 0;
one = one % 10;
answer.append(to_string(one));
if(i == a.size() - 1 && more == 1)
answer.append(to_string(more));
}
reverse(answer.begin(), answer.end());
return answer;
}
우수 코드 분석
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string solution(string a, string b) {
int alen = a.length();
int blen = b.length();
int carry = 0;
string answer = "";
for(int i = 1; i <= max(alen, blen); i++)
{
int numa = (i > alen)? 0 : a[alen-i]-'0';
int numb = (i > blen)? 0 : b[blen-i]-'0';
int num = numa + numb + carry;
if (num >= 10) carry = 1;
else carry = 0;
char numc = num%10+'0';
answer = numc + answer;
}
if(carry) answer = "1"+answer;
return answer;
}
이분도 나랑 비슷하게 생각하신 듯