[프로그래머스 / C++] 두 수의 합

YH·2023년 12월 3일
0

문제

두 수의 합 : 문제 링크


문제 분석

  • 0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return
    • 1 <= a, b의 길이 <= 100,000
  • 숫자의 최대 길이가 100,000이므로, long long int로도 덧셈을 수행할 수 없다. 따라서 가장 뒷자리부터 덧셈과 올림을 수행하여 한 자리씩 계산을 구현
  • 문자열을 뒤집을 때 사용하는 reverse() 함수를 사용하기 위해 algorithm 헤더를 include. a + b 값을 저장할 문자열 answer과 올림값을 저장할 정수형 변수 carry를 0으로 초기화. reverse() 함수를 통해 문자열 a, b를 모두 뒤집고, if ~ else문을 통해 a와 b중 더 긴 문자열에 맞춰서 짧은 문자열에 '0'을 추가하여 길이를 같게 만듬. for loop를 통해 a, b 각 문자열의 첫번째부터 마지막 원소까지 순환. 정수형 변수 sum에 해당 인덱스의 문자를 숫자로 변환하여 더하고, carry를 더한 값을 저장. sum이 10 이상일 경우 올림값이 생기므로, carry에 sum에서 10을 나눈 몫을 저장하고, sum에는 10으로 나눈 나머지를 저장. 이후, sum을 문자화 시켜서 answer에 저장. loop를 탈출하고, if문을 통해 carry가 0이 아님을 확인했을경우 올림값이 남아있음을 의미하므로, 문자화 시켜서 answer에 저장. 마지막으로 reverse() 함수를 통해 문자열 answer을 뒤집고 return

algorithm 헤더의 reverse() 함수 사용법
1. 배열
reverse(a, a+5); => a 배열의 처음부터 다섯번째 요소까지 뒤집음
2. 문자열, 벡터
1) reverse(str.begin(), str.end()); => 문자열 str의 처음부터 끝까지 뒤집음
2) reverse(v.begin()+1, v.end()-1); => 벡터 v의 두번째부터 마지막 이전 요소까지 뒤집음


풀이

#include <string>
#include <algorithm>

using namespace std;

string solution(string a, string b) {
    string answer = "";
    int carry = 0;
    
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    
    if(a.size() < b.size()) a.resize(b.size(), '0');
    else b.resize(a.size(), '0');
    
    for(int i = 0; i < a.size(); ++i) {
        int sum = (a[i] - '0') + (b[i] - '0') + carry;
        carry = sum / 10;
        sum %= 10;
        answer += sum + '0';
    }
    if(carry != 0) answer += to_string(carry);
    reverse(answer.begin(), answer.end());
    return answer;
}
profile
Keep Recycling Your Dreams

0개의 댓글