문제
두 정수 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++;
}
}
📌 이 문제에서 짚고가야 할 것!
.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 접근에서 고려할 점들인데 또 이렇게 헷갈리고 작성해서 적어봤다... 잘 고려하자..