[BOJ] 10757_큰 수 A+B

gogori6565·2022년 7월 29일
0

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

💡 key point : 입력 받는 수가 상당히 클 경우 어떻게 해결할 것인가? (int 자료형의 최대 크기를 넘어감)


풀이
<문제 접근 방법>
1. 정수가 아닌 string 으로 받아 문자열 배열로 계산하자
2. 입력 받은 수의 뒤에서 부터 숫자 하나씩 계산해서 배열에 넣어 띄어쓰기 없이 출력시키자

ex) 123 12 일 경우, 3+2=5, 2+1=3, 1=1 로 135를 출력시킬 계획.


풀이 코드

<코드 설명>
1. string s1, s2에 덧셈을 수행할 두 수 A, B를 담고 reverse를 통해 뒤집어준다. (뒤에서부터 계산할 거니까)
2. 문자열 배열로 접근해 숫자 하나씩 덧셈을 수행해 vector 변수에 담아준다. 이때, 덧셈에서 발생한 자리올림수를 다음 수의 덧셈에 참여하도록 해야한다.
3. 한 자리씩 덧셈을 모두 끝낸 vector를 다시 reverse를 통해 뒤집어준다. (올바르게 출력하기 위해)
4. vector 출력에 앞서 마지막에 생긴 자리올림수가 있다면 맨 처음에 출력해주어야한다.
5. vector의 수들을 차례대로 출력한다. (띄어쓰기없이 하나의 덧셈 수로 보이게)

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int main(void)
{
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string s1, s2;
    cin>>s1>>s2;

    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());

    vector<string> sum;
    int up=0,idx=0; //up : 자리올림수

    for(int i=0;i<(s1.size()>s2.size()?s1.size():s2.size());i++){
        if(i+1<=s1.size()&&i+1<=s2.size()){
            sum.push_back(to_string((((s1[i]-'0')+(s2[i]-'0'))+up)%10));
            up=(((s1[i]-'0')+(s2[i]-'0'))+up)/10;
        }
        else if(i+1>s1.size()){ //s1이 길이가 더 짧은 정수인 경우
            sum.push_back(to_string(((s2[i]-'0')+up)%10));
            up=((s2[i]-'0')+up)/10;
        }
        else{
            sum.push_back(to_string(((s1[i]-'0')+up)%10));
            up=((s1[i]-'0')+up)/10;
        }
    }

    reverse(sum.begin(),sum.end()); 
    if(up!=0) cout<<up; //혹시나 마지막 계산에서 자리올림수가 발생한 경우 출력해줘야하니까
    while(1){
        if(sum.size()<=idx) break; //벡터의 끝에 도달했으면 정지
        cout<<sum[idx];
        idx++;
    }
}

📌 이 문제에서 짚고가야 할 것!

1. .size()와 index

.size()는 string이든, vector이든 "123"일 경우 3을 출력한다.
그러나, 인덱스는 0~2까지임을 명심해야한다.

        if(i+1<=s1.size()&&i+1<=s2.size()){
        }
        else if(i+1>s1.size()){ //s1이 길이가 더 짧은 정수인 경우
        }
        else{
        }

나는 위 조건문에서 입력받은 두 문자열의 길이가 다를 경우 계산을 달리하고자 하였다. 이때, 만약 s1의 길이가 s2보다 더 작을 경우의 조건을 쓸 때, i>s1.size() 라고 처음에 작성하였는데, 이는 잘못 쓴 것이다!! (i는 index로 사용 중인 변수)

예를 들어, s1.size()=3, s2.size()=5 라고 하자. 말했듯 인덱스는 0부터 시작하기에 3번째 숫자를 [2]로 접근한다. 언뜻 보기에는 3번째를 계산했으니 이제 i(index)가 s1.size()보다 크겠지? 라고 착각하지만 실은 i는 3이고 s1.size()도 3이다. 즉, 3번째를 계산하였으나 i(index)는 이제 3이라 i>s1.size() 를 만족시키지 못한다. 따라서, s1의 길이가 더 짧으냐? 의 조건을 걸고 싶다면 i+1>s1.size() 라고 조건을 걸어주는 게 올바르다.

+) 위에서 우리는 이미 i+1<=s1.size()&&i+1<=s2.size() 를 먼저 검사해주기 때문에 두 문자열(s1,s2)이 같은 몇 번째 숫자를 계산하고 있을 때는 아래 else 에 접근하지 않는다. 내가 여태 설명한 것은 s1과 s2의 길이가 달라지는 시점에서의 조건을 설명한 것이다.

아주 간단한 배열 index 접근에서 고려할 점들인데 또 이렇게 헷갈리고 작성해서 적어봤다... 잘 고려하자..


문제 출처 : https://www.acmicpc.net/problem/10757

profile
p(´∇`)q

0개의 댓글